DSKSER page# 0001 next
2: COMMENT ⊗   VALID 00038 PAGES
3: C REC  PAGE   DESCRIPTION
4: C00001 00001
5: C00004 00002    BEGIN DSKSER ↔  SUBTTL  DSKSER  DISK SERVICE ROUTINE
6: C00006 00003    IOS BITS,  DISPATCH TABLE
7: C00008 00004    DISKUP  DHUNG   BLAST DISK.  DISK HUNG ROUTINE
8: C00010 00005    SETDDB CLRDDB   CORE ALLOCATION ROUTINES
9: C00016 00006    REFRES          DISK REFRESHER (I. E., INITIALIZER)
10: C00021 00007    DSKINI, DSKSTP, DSKTM1 (TIME CONTROL)
11: C00030 00008     BUFFERED I/O
12: C00039 00009     DUMP MODE I/O
13: C00043 00010    DUMP MODE INPUT
14: C00049 00011    DUMP MODE OUTPUT
15: C00054 00012    BOTH INPUT & OUTPUT CLOSE ARE ALWAYS CALLED FROM UUOCON.
16: C00059 00013    RELEASE UUO, CALL RESET, AND CALL EXIT
17: C00063 00014    MTAPE UUO -- BY R. HELLIWELL -- 16 JAN 72
18: C00068 00015            GDWRIT, GDREAD
19: C00073 00016            SETSAT, CLRSAT
20: C00075 00017            SATWRT, SATRD, SATFRC
21: C00078 00018            FILINF, WRTINF
22: C00083 00019            WRTOFF, RDOFF
23: C00086 00020            DIAGL, DIAGW
24: C00089 00021            GETRTR
25: C00092 00022            INFCOM, ADDBLK, FILEUP, TKSFRE, DSKRES
26: C00097 00023    LOOKUP
27: C00105 00024    ENTER
28: C00113 00025    RENAME
29: C00124 00026    FILE ACCESS CONTROL.
30: C00130 00027    SEARCH MFD AND UFD FOR FILE.
31: C00141 00028     RETRIEVAL SUBRS
32: C00150 00029     SAT TABLE OPERATIONS
33: C00156 00030    IASNBK
34: C00163 00031    DELETE A FILE, FREE DISK BLOCKS
35: C00165 00032     SWAPPER INTERFACE
36: C00169 00033    ENTER HERE FOR HIGH PRIORITY TRANSFER (CURRENTLY ONLY UDP IO).
37: C00173 00034    I-LEVEL SUBRS RETURN HERE WHEN DONE TO START ANOTHER REQUEST.
38: C00176 00035    I-LEVEL SUBRS PUSHJ HERE TO START A TRANSFER.
39: C00177 00036            ERROR HANDLING
40: C00181 00037     USER DISK PACK SERVICE
41: C00187 00038    UDP PASS WORD STUFF
42: C00191 ENDMK
43: C⊗;
    DSKSER page# 0002 next  prev
45: BEGIN DSKSERSUBTTL  DSKSER  DISK SERVICE ROUTINE
46: DEVBEG←←.                      ;START OF THE DEV SERVICES IN ENTIRE SYSTEM
47: 
48:         DEFINE  IOPCON <DIPCON>
49: 
50: ; PRELIMINARIES, STORAGE CONTROL
51: 
52: ;THIS CODE DEPENDS HEAVILY UPON:
53: ; 1) NO RESCHEDULING AT UUO LEVEL
54: ; 2) JOB NOT SHUFFLED OR SWAPPED WHEN IO ACTIVE.
55: 
56: TRIES←←1                        ;ASK DSKINT TO TRY A TRANSFER THIS MANY TIMES
57: ERRBOX←←1                       ;PLACE FOR ENTER, LOOKUP ERROR CODES
58: BUFIOW: XWD -BLKWDS,SYSBUF      ;167 FORMAT
59: UFDEXT←←'UFD'                   ;SIXBIT UFD.
60: 
61: MFDENT:        '  1  1'        ;'DIRECTORY ENTRY' FOR MFD
62: MFDEXT:         'UFD   '
63: MFDPRO:         155740,,0       ;ANYONE CAN READ THE MFD
64: MFDLOC:         1               ;DISK LOC. OF MFD
65: BAND0:         0
66: SATLOC:        0
67: 
68: UNAM←←0
69: UEXT←←1
70: UPRO←←2
71: UPPN←←3
72: 
73: DWRITE←←100                     ;TELL 167 TO WRITE, ELSE READ.
74: IOPDCH←←IOPCHN                  ;HI PRIORITY CHANNEL FOR 167
75: MSGPPN: '  2  2'                ;PPN OF MESSAGE AREA
    DSKSER page# 0003 next  prev
77: ;IOS BITS,  DISPATCH TABLE
78: 
79: ;BITS IN LH IOS INDICATE FILE STATUS:
80: 
81: GOBIT←←400000
82: READB←←200000
83: WRITEB←←100000
84: ALTERB←←40000
85: RENAMB←←20000
86: DELETB←←10000
87: NTRUFD←←4000
88: PNTDIF←←2000
89: IOSET←←400              ;CHEAT FOR USETI IN CLOSE
90: LOSBIG←←200
91: SATOP←←100
92: HDRDIF←←4               ;HOPEFULLY WE CAN GET AWAY WITH THIS ONE, (SAME BIT AS IOFST!)
93: DSKFGS←←SATOP+GOBIT
94: 
95: ;USER STATUS BITS IN RH IOS:
96: 
97: DMPBIT←←400
98: GARBIT←←200
99: 
100: ;IDENTIFY DDB LOCATIONS FOR TVSER. LOCATIONS ARE SAME 
101: ;AS IN BLACKINGTON, FOR NO GOOD REASON.
102: 
103: DSKBUF←←17
104: DSKCNT←←20
105: 
106:         JRST    CLRDDB          ;GIVE BACK DDB
107:         JRST    SETDDB          ;MAKE DDB
108:         JRST    DSKINI          ;INITIALIZATION (SYSINI)
109:         JRST    DHUNG           ;SHOULDN'T HANG
110: DSKDSP:JRST    DRELES          ;RELEASE
111:         JRST    DCLOSO          ;CLOSE OUTPUT
112:         JRST    DBUFO           ;BUFFERED OUTPUT
113:         JRST    DBUFI           ;BUFFERED INPUT
114:         JRST    DENTER          ;ENTER
115:         JRST    DLOOK           ;LOOKUP
116:         JRST    DDMPO           ;DUMP OUTPUT
117:         JRST    DDMPI           ;DUMP INPUT
118:         JRST    DSETO           ;USETO
119:         JRST    DSETI           ;USETI
120:         JRST    DGETF           ;UGETF
121:         JRST    DRENAM          ;RENAME
122:         JRST    DCLOSI          ;CLOSE INPUT
123:         POPJ    P,              ;UTPCLR
124:         JRST    DGETW           ;MTAPE
    DSKSER page# 0004 next  prev
126: ;DISKUP DHUNG   BLAST DISK.  DISK HUNG ROUTINE
127: 
128: DISKUP: CONO    IBM,CLRCHL
129:         MOVEI   TAC1,2                          ;MAY TAKE THIS MANY IF SCREWED UP.
130: DSKUP2: CONO    IBM,1                           ;.....
131:         CONO    IBM,2                           ;NOW RESET IBM.
132:         MOVEI   TAC,10000                       ;...WHICH MAY TAKE A WHILE.
133:         SOJG    TAC,.
134:         SOJGE   TAC1,DSKUP2
135:         CONO    PMP,460010!DSKCHN               ;ENABLE FOR RANDOM INT'S
136:         POPJ    P,
137: 
138: ;CALLED FROM DEVCHK BY SPECIAL CALL, DDB NOT SETUP
139: DHUNG:  PUSHJ   P,DISKUP                ;FLUSH THE WORLD.
140:         CONO    PMP,10                  ;MAKE SURE CHANNEL DOESN'T INTERRUPT ANYONE
141:         DATAO   IBM,NOPCMD              ;NOW SEE IF HE IS LISTENING TO US
142:         MOVEI   TAC,100000              ;WAIT THIS LONG
143:         CONSO   PMP,460000              ;WAIT FOR NEW STATUS, UNEND, OR PARITY ERROR.
144:         SOJG    TAC,.-1                 ;WAIT FOR SOME STATUS
145:         CONI    PMP,TAC                 ;GET GOOD BITS
146:         TRC     TAC,600                 ;CHANNEL END, DEVICE END
147:         TRCN    TAC,600                 ;DID WE GET THEM BOTH?
148:         JRST    OKNOW                   ;YES.  PERHAPS THE DISK IS HAPPY NOW
149:         PUSHACS
150:         PUSHJ   P,DISDATE
151:         PUSHJ   P,DISMES        
152:         ASCIZ   /RESET DISK.  THEN PUSH CONTINUE.
153: /
154:         SETOM   DISFLAG
155:         PUSHJ   P,DISFLUSH              ;MAKE SURE THEY SEE IT 
156:         POPACS
157:         HALT    .+1
158:         PUSHJ   P,DISKUP                ;BLAST HIM AGAIN
159: OKNOW:  CONO    PI,PIOFF                ;MAKE SURE WE DON'T LOSE
160:         SETOM   HNGFLG                  ;TELL DSKINT WHY
161:         CONO    PMP,660010!DSKCHN       ;MAKE AN INTERRUPT ON DISK CHANNEL
162:         CONO    PI,PION
163:         POPJ    P,
    DSKSER page# 0005 next  prev
165: ;SETDDB CLRDDB  CORE ALLOCATION ROUTINES
166: 
167: 
168: SETDDB:                        ;CALLED BY ASSASG IN IOCSS FOR INIT UUO.
169:         PUSHJ   P,GCOR1                 ;POINTER IN TAC
170:         PUSH    P,TAC1
171:         LDB     TAC1,PUNIT
172:         SKIPE   TAC1
173:         AOS     UDPCNT-1(TAC1)          ;BUMP COUNT OF DDBS FOR THIS UDP
174:         MOVE    TAC1,DKDBML(TAC1)       ;GET ADDRESS OF MODEL DDB
175:         HRRI    DDB,DDBSKW(TAC)         ;SAVE GOOD BITS IN LH
176:         HRLI    TAC,-DDBSKW(TAC1)       ;SOURCE ADDRESS IN LH
177:         BLT     TAC,DMPBUF(DDB)         ;CLEAR, INITIALIZE DDB
178:         HRLM    DDB,DEVSER(TAC1)        ;NEW LINK IN DUMMY
179:         POP     P,TAC1
180:         SETZM   DEVLOG(DDB)             ;CLEAR LOGICAL NAME.
181:         SETZM UFDPPN(DDB)
182:         SETZM UFDADR(DDB)
183:         JRST    DCLSDD                  ;CLEAR CRUD AND RETURN
184: 
185: CLRDDB:                        ;CALLED BY RELEASE IN UUOCON FOR RELEASE UUO.
186:         PUSHJ   P,DCLSDD
187:         SETZB   IOS,DEVIOS(DDB)                 ;HEAR NO EVIL
188:         LDB     TAC1,PUNIT                      ;GET UNIT NUMBER
189:         JUMPE   TAC1,CLRDD3                     ;JUMP IF MAIN DISK
190:         SOSE    TAC,UDPCNT-1(TAC1)
191:         JRST    CLRD99
192: 
193: ;THERE ARE NO OTHER DDBS.  GIVE AWAY THE FS FOR THE SAT TABLE
194:         SETOM   UDPOWN-1(TAC1)                  ;MAKE PUBLIC FOR NEXT INIT OR ASSIGN
195:         MOVE    AC3,DKDBML(TAC1)
196:         MOVSI   TAC,DVDSK
197:         IORM    TAC,DEVMOD(AC3)
198:         MOVEI   TAC,DSKDSP
199:         HRRM    TAC,DEVSER(AC3)
200:         SKIPE   TAC,SATADR(TAC1)
201:         PUSHJ   P,RCOR1                         ;GIVE AWAY THE FS BLOCK FOR SAT
202:         SETZB   TAC,SATADR(TAC1)
203:         TROA    TAC,DMES1
204: CLRD99: MOVEI   TAC,DMES2
205:         PUSH    P,DDB
206:         PUSH    P,TAC                           ;SAVE MESSAGE
207:         CONSO   PI,400                          ;IN PROG ON 7?
208:         JRST    CLRDD1
209:         PUSHJ   P,TTYFND                        ;J SET UP FROM COMMAND DECODER WE HOPE
210:         PUSH    P,-1(P)                         ;GET UDP DDB TO (P) FOR ERNAM
211:         PUSHJ   P,ERNAM                         ;TYPE "DEVICE UDPN"
212:         POP     P,(P)
213:         POP     P,TAC                           ;SETUP MESSAGE
214:         PUSHJ   P,CONMES
215:         JRST    CLRDD2                          ;RELEASE DDB
216: 
217: DMES1:  ASCIZ   / MAY BE UNLOADED
218: /
219: DMES2:  ASCIZ   / STILL IN USE - DON'T UNLOAD
220: /
221: 
222: CLRDD1: SKIPN   UDPCNT-1(TAC1)                  ;RELEASE BY UUO:
223:         JRST    CLRD19                          ;ALWAYS GIVE DMES1 IF APPROPRIATE,
224:         MOVE    TAC,DKDBML(TAC1)                ;BUT DON'T GIVE DMES2 IF THIS JOB HAS
225: CLRD11: HLRZ    TAC,DEVSER(TAC)                 ; OTHER DDBS FOR THIS UDP
226:         JUMPE   TAC,CLRD19                      ;THIS CAN'T HAPPEN
227:         MOVE    TAC1,DEVNAM(TAC)
228:         CAME    TAC1,DEVNAM(DDB)
229:         JRST    CLRD19                          ;NO MORE DDBS, GIVE THE MESSAGE
230:         LDB     TAC1,[POINT 6,DEVCHR(TAC),5]    ;PJOBN
231:         CAIE    TAC,(DDB)                       ;THE DDB WE'RE FLUSHING DOESN'T COUNT
232:         CAME    TAC1,JOB(PID)
233:         JRST    CLRD11                          ;NOT OUR DDB, KEEP LOOKING
234:         POP     P,TAC                           ;OUR DDB, DON'T DO THE MESSAGE
235:         JRST    CLRDD2
236: 
237: CLRD19: JUMPE   PROG,CLRDD2                     ;NO CORE, NO MESSAGE
238:         PUSHJ   P,TTYFUW
239:         PUSH    P,-1(P)                         ;UDP DDB TO (P) FOR ERNAM
240:         PUSHJ   P,ERNAM                         ;TYPE "DEVICE UDPN"
241:         POP     P,(P)
242:         POP     P,TAC
243:         PUSHJ   P,CONMES
244:         PUSHJ   P,TYPGO
245: CLRDD2: POP     P,DDB
246:         LDB     TAC1,PUNIT
247: CLRDD3: MOVE    TAC,DKDBML(TAC1)                ;SEARCH FOR THIS DDB - START AT MODEL
248: CLRDD4: MOVEI   TAC1,(TAC)
249:         HLRZ    TAC,DEVSER(TAC1)
250:         JUMPE   TAC,CPOPJ                       ;SHOULDN'T HAPPEN
251:         CAIE    TAC,(DDB)                       ;RIGHT ONE YET?
252:         JRST    CLRDD4                          ;NO. KEEP SEARCHING
253:         MOVE    DDB,DEVSER(TAC)                 ;LINK TO ONE AFTER LOSER
254:         HLLM    DDB,DEVSER(TAC1)                ;SPLICE AROUND IT
255:         SUBI    TAC,DDBSKW                      ;CALC ADDRESS OF FREE STG BLOCK
256:         JRST    RCOR1                           ;RETURN TO DISK FREE STG. AND POPJ
257: 
258: ;CORE ALLOCATION ROUTINES
259: 
260: GETCOR: PUSHJ   P,GCOR1                         ;GET DUMP MODE COMMAND BUFFER.
261:         MOVSM   TAC,DMPBUF(DDB)
262:         POPJ    P,
263: 
264: GCOR1:  MOVEI   AC3,DDBSIZ                      ;SET SIZE
265:         PUSHJ   P,FSGET                         ;GET FREE STORAGE
266:         JRST    GCOR2                           ;HAVE TO WAIT
267:         MOVEI   TAC,(AC1)                       ;RETURN ADDRESS IN TAC
268:         POPJ    P,
269: 
270: GCOR2:  SUB     P,[XWD 4,4]                     ;CALLED FROM COMMAND DECODER
271:         JRST    DLYCM1
272: 
273: RTNCOR: HLRZ    TAC,DMPBUF(DDB)                 ;RELEASE DUMP MODE CMD BUFFER.
274:         SETZM   DMPBUF(DDB)
275:         JUMPE   TAC,CPOPJ                       ;IF NONE, LEAVE QUICK
276: RCOR1:  HRRZ    AC1,TAC                         ;GET ADDRESS OF BLOCK
277:         JRST    FSGIVE                          ;RETURN IT
    DSKSER page# 0006 next  prev
279: ;REFRES         DISK REFRESHER (I. E., INITIALIZER)
280: 
281: COMMENT ∩
282: ↑REFRESH:
283:         PUSHJ   P,DQINI                 ;INITIALIZE SUBR QUEUE, ETC.
284:         CONO    PI,PION
285:         MOVEI   DDB,DSKDDB
286:         MOVEI   IOS,0
287:         MOVEI   DAT,SATIN               ;READ IN OLD SAT TABLE.
288:         PUSHJ   P,DDOIT                 ;SEE TO IT.
289:         SKIPLE  TAC,BADCNT+SATTAB       ;SEE IF ITS BAD TRACK TABLE IS BELIEVABLE.
290:         CAILE   TAC,BADMAX
291:         JRST    REF3                    ;IGNORE OLD TABLE.
292:         MOVEI   TAC1,0                  ;CHECKSUM OLD TABLE.
293:         ADD     TAC1,BADTRK-1+SATTAB(TAC)
294:         SOJG    TAC,.-1
295:         CAMN    TAC1,BADCHK+SATTAB
296:         JRST    REF4                    ;IT CHECKS. USE IT.
297: REF3:   SETZM   BADCNT+SATTAB           ;FLUSH OLD TABLE.
298:         SETZM   BADCHK+SATTAB
299: REF4:   MOVE    TAC1,TIME               ;GET CURRENT TIME,
300:         DATAI   DSK,TAC                 ;AND CURRENT POSITION OF LIBRASCOPE..
301:         XOR     TAC,TAC1                ;..AND MAKE SHINY NEW SATID.
302:         MOVMM   TAC,SATID+SATTAB        ;MAKE SATID ALWAYS POSITIVE.
303:         MOVMM   TAC,SATID1              ;MAKE BACKUP SATID'S RIGHT
304:         MOVMM   TAC,SATID2
305:         SETZM   LSTBLK+SATTAB
306:         SETZM   SATBIT+SATTAB
307:         MOVE    TAC,[SATBIT+SATTAB,,SATBIT+1+SATTAB]
308:         BLT     TAC,SATBIT+SATWCT+SATTAB        ;CLEAR THE REST
309:         MOVE    TAC,MFDLOC              ;PROTECT MFD IN SAT
310:         SUBI    TAC,1
311:         IDIVI   TAC,=36                 ;DO THE MAPPING OURSELVES
312:         MOVEI   DAT,1                   ;TO ACHIEVE UNCONDITIONLITY
313:         MOVEM   DAT,DSKUSE+SATTAB       ;ECONOMY!
314:         ROT     DAT,(TAC1)
315:         IORM    DAT,SATBIT+SATTAB(TAC)
316:         MOVEM   DAT,SATCHK+SATTAB       ;OK FOR SAT TABLE.
317:         MOVEI   DAT,SATOUT              ;WRITE IT.
318:         PUSHJ   P,QENTER
319:         PUSHACS
320:         PUSHJ   P,DISINIT               ;HERE FROM ONCE, WE NEED TO INITIALIZE THIS
321:         PUSHJ   P,DISDATE
322:         PUSHJ   P,DISMES
323:         ASCIZ   /SATID=/
324:         MOVE    TAC,SATID+SATTAB
325:         PUSHJ   P,DISOCT
326:         PUSHJ   P,DISMES
327:         ASCIZ   /  BADCNT=/
328:         MOVE    TAC,BADCNT+SATTAB
329:         PUSHJ   P,DISLOC
330:         PUSHJ   P,DISCRLF
331:         SETOM   DISFLAG
332:         PUSHJ   P,DISFLUSH              ;FORCE ALL MESSAGES OUT
333:         POPACS
334: REF2:   MOVEI   TEM,SYSRTV              ;CONSTRUCT EMPTY MFD IN SYSBUF
335:         HRLI    TAC,MFDENT
336:         HRRI    TAC,DSKDAT(TEM)
337:         BLT     TAC,DDPRO(TEM)          ;COPY NAME, EXT, PROT
338:         MOVE    TAC,SYSPPN
339:         MOVEM   TAC,DDPPN(TEM)
340:         SETZM   DDLNG(TEM)
341:         HRLI    TAC,DDLNG(TEM)
342:         HRRI    TAC,DDLNG+1(TEM)
343:         BLT     TAC,BKDSIZ+SECSIZ-1+DSKDAT(TEM)         ;CLEAR THE REST
344:         MOVE    TAC,MFDLOC              ;SET UP RTVL PTRS
345:         MOVEM   TAC,DDLOC(TEM)
346:         HRLM    TAC,DPTR(TEM)
347:         AOS     DGRP1R(TEM)
348:         MOVE    TAC,SATID+SATTAB
349:         MOVEM   TAC,DSATID(TEM)         ;GIVE MFD THE SAT ID TOO
350:         MOVE    TAC,THSDAT              ;DATE CREATED
351:         HRRM    TAC,DDEXT(TEM)
352:         PUSHJ   P,DSKTM1
353:         DPB     TAC,[POINT 3,DDEXT(TEM),20];RPH/DATE75
354:         ORM     TAC1,DDPRO(TEM)         ;TIME LAST WRITTEN
355:         PUSHJ   P,XWSYNC                ;WAIT FOR SATOUT
356:         MOVE    TAC,BUFIOW
357:         MOVEM   TAC,TFRIOW(DDB)
358:         MOVE    TAC,MFDLOC
359:         PUSHJ   P,BK2SEC
360:         MOVEM   TAC,TFRSEC(DDB)
361:         MOVEI   DAT,TSTART
362: ∩;END OF COMMENTED OUT REFRESH CODE
363: 
364: DDOIT:  PUSHJ   P,QENTER                ;MAKE REQUEST AND
365: 
366: XWSYNC: MOVE    TAC,[XWD DEVSBB,IOACT]  ; SPIN TILL DONE
367:         TDNE    TAC,DEVIOS(DDB)
368:         JRST    .-1
369:         POPJ    P,
    DSKSER page# 0007 next  prev
371: ;DSKINI, DSKSTP, DSKTM1 (TIME CONTROL)
372: ;TIME CONTROL. INFORMATION KEPT AS FOLLOWS:
373: ;DATE CREATED IN UFD (FILEXT) [DEC - DATE LAST WRITTEN]
374: ;TIME LAST WRITTEN IN UFD (FILPRO) [DEC - TIME CREATED]
375: ;TIME LAST REFERENCED IN FILE - DREFTM
376: ;TIME LAST DUMPED IN FILE - DDMPTM
377: ;LATTER TWO ARE ACCESSED THRU 6-WORD ENTER-LOOKUP BLOCKS IF
378: ;DMPBIT SET BY INIT.
379: 
380: DSKTM1:                        ;CALLED ALSO FROM UUOCON -DSKTIM UUO
381:         MOVE    TAC,TIME
382:         IDIVI   TAC,=3600                       ;JIFFIES/MIN.
383:         HRRZ    TAC1,THSDAT
384:         DPB     TAC,[POINT 11,TAC1,23]
385:         LDB     TAC,[POINT 3,THSDAT,35-12]      ;EXTRA BITS IN TAC - RPH/DATE75
386:         POPJ    P,                              ;RETURN RESULT IN TAC1.
387: 
388: ;DSKSTP CALLED FROM AUTORELOAD CODE IN OUTER TO PRESERVE THE SAT TABLE
389: DSKSTP:
390:         PUSHJ   P,DQINI         ; CLEAR QUEUE
391:         CONO    PI,2202         ; TURN ON PI AND CH6
392: OSAT:   MOVEI   DDB,DSKDDB
393:         PUSHJ   P,CUSATO
394:         JRST    XWSYNC
395: 
396: ISAT:   MOVEI   DDB,DSKDDB      ;HERE FROM ACISAT
397:         MOVEI   DAT,SATIN
398:         PUSHJ   P,NENTER
399:         JRST    XWSYNC          ;WAIT FOR DISK AND RETURN
400: 
401: ;DSKINI CALLED VIA DISPATCH FROM IOGO IN SYSINI FOR 200 RESTART.
402: 
403: DSKINI: PUSHJ   P,DQINI
404:         SETZM   CUSLOC                  ;FORGET CUSLOC ON RESTARTS
405:         PUSHJ   P,ACISAT                ;READ SAT TABLE
406:         MOVE    TAC,DSKDDB+DEVIOS       ;GET IOS BITS
407:         TRNE    TAC,IODERR!IODTER       ;DID IT WORK?
408:         JRST    NOSAT                   ;NO
409:         MOVEI   DDB,UDP1DD              ;LINK OUT CRUFTY OLD DISK DDB'S
410:         HRLM    DDB,DSKDDB+DEVSER
411:         SETZM   SATADR+1
412: IFG UPACKS-1,<  MOVE    TAC,[SATADR+1,,SATADR+2]
413:                 BLT     TAC,SATADR+UPACKS>
414:         SETOM   UDPOWN
415: IFG UPACKS-1,<  MOVE    TAC,[UDPOWN,,UDPOWN+1]
416:                 BLT     TAC,UDPOWN+UPACKS-1>
417:         SETZM   UDPCNT
418: IFG UPACKS-1,<  MOVE    TAC,[UDPCNT,,UDPCNT+1]
419:                 BLT     TAC,SATMOD+UPACKS>
420: 
421:         MOVEI   DDB,DSKDDB              ;MAKE SURE WE LINK TO UDPINI
422:         SKIPE   FBACT                   ;SWAPPING WHERE?
423:         POPJ    P,                      ;ON FASTBANDS, SKIP SWAPPING PACK CRUD
424: PASCHK: MOVEI   DDB,CAT(CAT(UDP,\<UPACKS>),DD)  ;THE LAST UDP
425:         MOVEI   TAC,ASSCON!ASSPRG
426:         IORM    TAC,DEVMOD(DDB)         ;ASSIGN THIS UDP
427:         MOVE    TAC,['*SWAP*']
428:         MOVEM   TAC,DEVLOG(DDB)         ;ANNOUNCE THAT UDP IS USED FOR SWAPPING
429:         SETZB   TAC,DEVIOS(DDB)
430:         DPB     TAC,PJOBN               ;TO JOB 0
431:         SETZM   UDPOWN-1+UPACKS         ;RESERVE PRIVATE UDP FOR JOB ZERO
432:         SETZM   SWPDDB                  ;THIS IS THE UDP WE ARE SWAPPING ON
433:         MOVEI   DAT,PASSIN              ;READ PASSWORD BLOCK
434:         PUSHJ   P,NENTER
435:         PUSHJ   P,XWSYNC                ;WAIT FOR IT
436:         MOVE    TAC,DEVIOS(DDB)
437:         TRNE    TAC,IODERR!IODTER!IOIMPM
438:         JRST    PASERR                  ;IO ERRORS OCCURED
439:         MOVE    TAC,['PASS  ']          ;IS IT INITIALIZED
440:         CAMN    TAC,DSKDAT(DDB)
441:         CAME    TAC,DSKDAT+1(DDB)
442:         JRST    PASOK                   ;NO. IT IS GRUNGY
443:         SKIPE   TAC,DSKDAT+2(DDB)       ;PASSWORD MUST BE NULL FOR SWAPPING
444:         CAMN    TAC,['*SWAP*']          ;SWAPPING PACK?
445:         JRST    PASOK                   ;YES.
446:         JRST    PAKERR                  ;BARF
447: PASOK:  MOVEI   DAT,PASOUT              ;NOW TRY WRITING
448:         PUSHJ   P,NENTER
449:         PUSHJ   P,XWSYNC
450:         MOVE    TAC,DEVIOS(DDB)
451:         TRNE    TAC,IODERR!IODTER!IOIMPM
452:         JRST    PASERR                  ;POSSIBLY WRITE-LOCKED
453:         MOVEM   DDB,SWPDDB              ;SAVE DDB ADDRESS FOR SWAP OPS
454:         MOVEI   DDB,DSKDDB              ;SET UP DDB FOR SYSINI?
455:         POPJ    P,
456: 
457:         DEFINE  SWPMES $(XXX) < ASCIZ   /SWAPPING DRIVE (UDP$XXX$) / >
458: 
459: PAKERR: PUSHACS
460:         PUSHJ   P,DISMES
461:         SWPMES  (\<UPACKS>)
462:         PUSHJ   P,DISMES
463:         ASCIZ   /WRONG PACK MOUNTED.
464: /
465: PASTRY: PUSHJ   P,DISMES
466:         ASCIZ   /FIX IT.  PUSH CONTINUE TO TRY AGAIN
467: /
468:         SETOM   DISFLAG
469:         PUSHJ   P,DISFLUSH
470:         POPACS
471:         HALT    PASCHK                  ;TRY ALL OVER AGAIN
472: 
473: 
474: PASERR: PUSHACS
475:         PUSH    P,TAC
476:         PUSHJ   P,DISMES
477:         SWPMES  (\<UPACKS>)             ;TELL SOMEONE WHICH UDP WE'RE USING.
478:         POP     P,TAC
479:         TRNN    TAC,IOIMPM              ;OFFLINE OR WRITE-LOCK?
480:         JRST    PASIOE                  ;NO.  REAL IO ERROR
481:         PUSHJ   P,DISMES
482:         ASCIZ   /OFF LINE OR WRITE LOCKED
483: /
484:         JRST    PASTRY
485: 
486: PASIOE: PUSHJ   P,DISMES
487:         ASCIZ   /IO ERROR
488: /
489:         JRST    PASTRY
490: 
491: NOSAT:  PUSHACS
492:         MOVE    TAC,[JRST AUTOLOAD]     ;MAKE THEM START FROM THE FRONT
493:         MOVEM   TAC,SYSDSP
494:         MOVEM   TAC,SYSDSP+2
495:         MOVE    TAC,[XWD SYSDSP+2,SYSDSP+3]
496:         BLT     TAC,SYSDSP+7
497:         MOVE    TAC,UPTIME
498:         MOVEM   TAC,LASTRESTART         ;DON'T DO A 200 RESTART
499:         PUSHJ   P,DISDATE
500:         PUSHJ   P,DISMES
501:         ASCIZ   /FAILED TO GET SAT TABLE READ IN.  CHECK DISK, THEN RELOAD.
502: /
503:         SETOM   DISFLAG
504:         PUSHJ   P,DISFLUSH
505:         POPACS
506:         HALT    AUTOLOAD
507: 
508: DQINI:  SETZM   QBEGIN                  ;INITIALIZE DISK SUBR QUEUE.
509:         MOVSI   TAC,QUBEG               ;START OF THE UDP QUEUE
510:         HLRZM   TAC,MIPTR+1
511:         HLRZM   TAC,MOPTR+1
512:         MOVSI   TAC,QBEGIN              ;START OF THE DISK QUEUE
513:         HLRZM   TAC,MIPTR
514:         HLRZM   TAC,MOPTR
515:         SETZM   DQCNT                   ;NUMBER OF TASKS IN DISK QUEUE
516:         HRRI    TAC,QBEGIN+1
517:         BLT     TAC,QUEND               ;CLEAR OUT REQUEST QUEUE
518:         PUSHJ   P,DISKUP                ;MAKE IBM LISTEN TO US
519: 
520: IJOB:   SETZM   DFBUSY
521:         SETZM   SQREQ
522:         HLLZS   IOPCON
523:         SETZM   DXB
524:         SETZM   DSKEDD
525:         SETZM   ERRBIT
526:         SETZM   DSKERB
527:         SETZM   BKIN
528:         POPJ    P,
529: 
530: ACISAT: CONO    PI,PION                 ;CERTAINLY ISN'T ON YET
531:         SKIPN   SATDIR                  ;READ IF -1.(FIRST TIME ONLY)
532:         JRST    OSAT                    ;ELSE WRITE (POPJ FROM OSAT)
533:         MOVE    TAC,SATID+SATTAB        ;MAKE SURE COPIES OF SATID AGREE
534:         MOVEM   TAC,SATID1
535:         MOVEM   TAC,SATID2
536:         PUSHJ   P,ISAT                  ;GET SAT IN
537:         MOVE    TAC,SATID+SATTAB        ;NOW COPY GOOD SATID
538:         MOVEM   TAC,SATID1
539:         MOVEM   TAC,SATID2
540:         SETZM   SATDIR                  ;FROM NOW ON, WRITE THE SAT TABLE
541: 
542: ;ENTER HERE FROM SATGET AT UUO LEVEL FOR NEW STYLE UDP SERVICE
543: ACISTT: LDB     AC3,PUNIT               ;GET THE DISK UNIT NUMBER
544:         MOVE    TAC,LSTBTB(AC3)         ;NUMBER OF BITS IN THIS SAT TABLE
545:         ADDI    TAC,43
546:         IDIVI   TAC,44
547:         IMULI   TAC,44                  ;CALC NUMBER OF WORDS IN SAT TABLE
548:         MOVE    AC3,SATADR(AC3)         ;ADDRESS OF SAT TABLE
549:         MOVE    TAC1,[POINT 1,SATBIT(AC3)]      ;PREPARE TO COUNT SAT BITS!
550:         SETZB   AC1,BADCHK(AC3)         ;BIT COUNT, BAD TRACK CHECKSUM
551:         ILDB    AC2,TAC1                ;LOAD A BIT
552:         ADDI    AC1,(AC2)               ;SEE THE CLEVER PROGRAMMER COUNT BITS
553:         SOJGE   TAC,.-2                 ;COUNT THEM ALL
554:         MOVEM   AC1,DSKUSE(AC3)         ;SET HONEST DSKUSE
555:         SKIPG   AC2,BADCNT(AC3)         ;ANY BAD TRACKS TO TURN ON?
556:         POPJ    P,                      ;NO.
557:         CAILE   AC2,BADMAX
558:         MOVEI   AC2,BADMAX
559:         HRLOI   AC2,-1(AC2)
560:         EQVI    AC2,BADTRK(AC3)         ;FORM AOBJN POINTER
561: MRKITB: MOVE    TAC,(AC2)
562:         ADDM    TAC,BADCHK(AC3)         ;ACCUMULATE CHECKSUM
563:         PUSHJ   P,MRKBLK                ;MARK BAD TRACK SO IT WON'T GET USED
564:         AOBJN   AC2,MRKITB
565:         POPJ    P,
    DSKSER page# 0008 next  prev
567: ; BUFFERED I/O
568: 
569: ;BUFFERED INPUT
570: 
571: DBUFI:  TLNN    IOS,READB!WRITEB!ALTERB 
572:         JRST    ENOLUK                          ;NO LOOKUP
573:         TRNE    IOS,IODERR!IODTER               ;ERROR LAST TIME?
574:         POPJ    P,                              ;YES
575:         TLNE    IOS,LOSBIG                      ;BAD RETRIEVAL?
576:         JRST    EGARB                           ;YES PRINT MESSAGE
577:         MOVSI   IOS,IO
578:         ANDCAB  IOS,DEVIOS(DDB)                 ;MARK AS READING
579:         JSP     AC1,TSTEOF                      ;RETURN NOW IF PAST EOF
580:         JRST    DIEOF
581:         MOVEI   DAT,DIBUFI
582:         PUSHJ   P,QENTER                        ;QUEUE TASK. USER PGM CAN PROCEED
583:         POPJ    P,
584: 
585: TSTEOF: MOVE    TAC,USETP(DDB)                  ;GET USET POINTER
586:         SUBI    TAC,1
587:         ASH     TAC,RECWSH                      ;RECORD NUMBER * 200 = WORD NUMBER
588:         CAMGE   TAC,FILLNG(DDB)                 ;PAST EOF?
589:         JRST    1(AC1)                          ;NO.  OK TO READ MORE
590:         JRST    (AC1)                           ;PAST EOF
591: 
592: ;***INTERRUPT SUBR***
593: 
594: DIBUFI: PUSHJ   P,GETBLK                        ;GET BLOCK INTO SYSBUF
595:         JUMPE   TAC,SETLOS                      ;NON EX = BAD RETRIEVAL
596:         PUSHJ   P,AUDCHK                        ;DID WE GET THE RIGHT FILE?
597: 
598: DIBFI1: MOVE    TAC,USETP(DDB)
599:         SUB     TAC,DGRP1R(DDB)
600:         IDIVI   TAC,RCPBLK
601:         ASH     TAC1,RECWSH                     ;7
602:         HRRZ    TAC,DEVIAD(DDB)                 ;GET REL. ADDR. OF USER BUFFER
603:         HLRZ    DAT,PROG
604:         CAIG    TAC,(DAT)                       ;ILL. ADR.?
605:         JRST    DIBFI3                          ;NO, RELOCATE BY PROG
606:         LDB     DAT,PSEGN                       ;YES, CHECK FOR UPPER SEGMENT
607:         HRRZ    DAT,JBTADR(DAT)
608:         ADDI    TAC,-400000(DAT)
609:         JRST    DIBFI4
610: 
611: DIBFI3: ADDI    TAC,(PROG)                      ;RELOCATE INTO LOWER
612: DIBFI4: HRLI    DAT,SYSDTA(TAC1)
613:         HRRI    DAT,2(TAC)
614:         BLT     DAT,RECSIZ+1(TAC)               ;INTO USER'S BUFF
615:         AOS     TAC1,USETP(DDB)
616:         SUBI    TAC1,1
617:         ASH     TAC1,RECWSH
618:         SUB     TAC1,FILLNG(DDB)
619:         MOVEI   DAT,RECSIZ                      ;SET UP WORD COUNT
620:         JUMPL   TAC1,DIBFI2                     ;IF NOT PAST EOF
621:         TLO     IOS,IOEND                       ;EOF; TELL USER
622:         SUB     DAT,TAC1                        ;ADJUST WORD COUNT
623: DIBFI2: HRRM    DAT,1(TAC)                      ;GIVE WD CT TO USER.
624:         PUSHJ   P,ADVBFF
625:         POPJ    P,                              ;NO MORE BUFFERS EMPTY.
626:         TLNE    IOS,IOEND                       ;QUIT IF END OF FILE
627:         POPJ    P,
628:         MOVE    TAC,USETP(DDB)
629:         SUB     TAC,DGRP1R(DDB)
630:         IDIVI   TAC,RCPBLK
631:         JUMPN   TAC1,DIBFI1                     ;DO MORE IF BLK NOT DONE
632:         POPJ    P,                              ;QUIT.
633: 
634: DIEOF:  TLO     IOS,IOEND
635:         JRST    DSIOS                           ;STORE IOS, AND POPJ.
636: 
637: ;BUFFERED OUTPUT
638: 
639: DBUFO:  TLNN    IOS,WRITEB!ALTERB
640:         JRST    ENOENT
641:         MOVSI   IOS,IO
642:         IORB    IOS,DEVIOS(DDB)                 ;FLAG OUTPUT FOR UUOCON
643:         TLNE    DDB,OCLOSB                      ;CALLED BY CLOSE?
644:         JRST    DBUFO1                          ;YES, DO OUTPUT NOW
645: DBUFOA: TRNE    IOS,IODERR!IODTER               ;ERROR RECENTLY
646:         POPJ    P,                              ;YES, TELL HIM
647:         TLNE    IOS,LOSBIG                      ;OR BAD RETRIEVAL
648:         JRST    EGARB                           ;YES
649:         HLR     TAC,DEVBUF(DDB)                 ;PTR TO OBUFF HDR
650:         XCTR    XR,[HRR TAC,(TAC)]              ;GET PTR TO NEXT FREE BFR
651:         XCTR    XR,[SKIPL TAC1,(TAC)]
652:         JRST    DBFOGO                          ;NEXT BUFFER IS FREE.
653:         TRNN    IOS,IOACT                       ;NEXT BUFFER IS FULL.
654:         PUSHJ   P,DBUFO1                        ;IF NOT ACTIVE, START OUTPUT.
655:         PUSHJ   P,WSYNC                         ;WAIT FOR OUTPUT TO HAPPEN.
656:         JRST    DBUFOA                          ;RETURN OR START NEXT OUTPUT.
657: 
658: DBFOGO: XCTR    XR,[SKIPGE (TAC1)]              ;CHECK ONE AFTER.
659:         TRNE    IOS,IOACT                       ;IT'S FULL, OUTPUT ALREADY GOING?
660:         POPJ    P,                              ;YES, LET USER RUN.
661: 
662: DBUFO1: PUSHJ   P,MAKBLK                        ;ENTER A TRANSFER IN QUEUE.
663:         MOVEI   DAT,DIBUFO                      ;CALL INT LEVEL SUBR
664:         PUSHJ   P,QENTER                        ;USER PGM CAN PROCEED
665:         POPJ    P,
666: 
667: ;*** INTERRUPT SUBR ***
668: 
669: DIBUFO: MOVE    TAC,USETP(DDB)                  ;LOAD SYSBUF & OUTPUT
670:         MOVEM   TAC,DSKFAD(DDB)
671:         SUB     TAC,DGRP1R(DDB)
672:         IDIVI   TAC,RCPBLK
673:         ASH     TAC1,RECWSH
674:         MOVEI   TAC,SYSDTA(TAC1)                ;DATA AREA OF SYSBUF
675:         MOVEM   TAC,CORFAD(DDB)
676:         MOVEM   TAC,CORLAD(DDB)
677: 
678: DIBFO1: HRRZ    TAC,DEVOAD(DDB)
679:         HLRZ    TAC1,PROG
680:         CAIG    TAC,(TAC1)
681:         JRST    DIBFO2
682:         LDB     TAC1,PSEGN
683:         HRRZ    TAC1,JBTADR(TAC1)
684:         ADDI    TAC,-400000+2(TAC1)
685:         JRST    DIBFO3
686: 
687: DIBFO2: ADDI    TAC,2(PROG)
688: DIBFO3: SKIPG   AC1,-1(TAC)                     ;ANY WORDS IN THIS BUFFER
689:         JRST    DIBFO4                          ;NO, SKIP OVER IT
690:         MOVSS   TAC
691:         HRR     TAC,CORLAD(DDB)
692:         MOVEI   TAC1,RECSIZ(TAC)
693:         MOVEM   TAC1,CORLAD(DDB)
694:         BLT     TAC,-1(TAC1)                    ;COPY USRBUF TO SYSBUF
695:         AOS     USETP(DDB)
696:         PUSHJ   P,ADVBFE
697:         JRST    DIBOFT                          ;NO MORE BUFFERS READY
698:         MOVE    TAC,USETP(DDB)
699:         SUB     TAC,DGRP1R(DDB)
700:         IDIVI   TAC,RCPBLK
701:         JUMPN   TAC1,DIBFO1                     ;BLOCK NOT DONE, DO MORE
702: 
703: DIBOFT: MOVE    TAC,CORFAD(DDB)                 ;PICK UP STARTING ADDRESS
704:         CAML    TAC,CORLAD(DDB)                 ;BEFORE FINISHING ADDRESS
705:         POPJ    P,                              ;NO, NOTHING TO DO.
706:         MOVE    TAC,USETP(DDB)                  ;DID FILE GROW?
707:         SUBI    TAC,1+1                         ;-1 FOR AOS ABOVE, -1 FOR LAST RECORD,
708:         ASH     TAC,RECWSH                      ;WHICH WILL BE COUNTED BY WC BELOW
709:         CAILE   AC1,RECSIZ
710:         MOVEI   AC1,RECSIZ                      ;AVOID BUMPING WC BY TOO MUCH
711:         ADDI    TAC,(AC1)                       ;ADD WC FROM LAST RECORD WRITTEN
712:         CAMG    TAC,FILLNG(DDB)
713:         JRST    DIBOFW                          ;NO, GO DO OUTPUT.
714:         MOVEM   TAC,FILLNG(DDB)                 ;YES, MARK IT SO
715: ;       MOVEI TAC,1
716: ;       CAME TAC,DGRP1R(DEVDAT) ;IF BEYOND FIRST GROUP,
717: ;       TLOA IOS,HDRDIF!PNTDIF          ;UPDATE RTVL AT CLOSE.
718:         TLO     IOS,PNTDIF!HDRDIF
719: DIBOFW: MOVE    TAC,CORFAD(DDB)                 ;IF RTVL NOT CONTIGUOUS,
720:         CAIN    TAC,SYSDTA                      ;CAN'T WRITE IT NOW.
721:         TLNN    IOS,PNTDIF
722:         JRST    DIBOFN                          ;UPDATING RTVL NOT RQD
723:         PUSHJ   P,AUDINF
724:         HRLI    TAC,DSKDAT(DDB)                 ;BLT RTVL FROM DDB...
725:         HRRI    TAC,SYSBUF                      ;TO SYSBUF
726:         BLT     TAC,SYSDTA-1
727: ;       PUSHJ P,SPREDT          ;FIRST UPDATE PRIOR RTVL.
728:         MOVE    TAC,DSKFAD(DDB)                 ;SET UP TRANSFER
729:         PUSHJ   P,LR2BLK
730:         JUMPE   TAC,SETLOS                      ;NON EX = BAD RETRIEVAL
731:         PUSHJ   P,BK2SEC
732:         LDB     AC3,PUNIT
733:         ADD     TAC,BFSETS(AC3)                 ;ADD IN OFFSET
734:         MOVEM   TAC,TFRSEC(DDB)
735:         MOVE    TAC,CORFAD(DDB)
736:         SUB     TAC,CORLAD(DDB)
737:         ADD     TAC,[SYSBUF,,-40]
738:         MOVSM   TAC,TFRIOW(DDB)                 ;WRITE ONLY THE RETRIEVAL AND VALID DATA
739:         JRST    RERITE                          ;GO DO OUTPUT.
740: 
741: DIBOFN: MOVE    TAC,CORFAD(DDB)                 ;HERE IF RTVL IS OUT
742:         SUB     TAC,CORLAD(DDB)                 ;GET -WORD COUNT
743:         HRL     TAC,CORFAD(DDB)
744:         MOVSM   TAC,TFRIOW(DDB)
745:         MOVE    TAC,DSKFAD(DDB)                 ;STARTING RECORD NO.
746:         PUSHJ   P,LR2BLK
747:         JUMPE   TAC,SETLOS                      ;NON EX = BAD RETRIEVAL
748:         PUSHJ   P,BKMAP
749:         LDB     AC1,PUNIT
750:         ADD     TAC,BFSETS(AC1)
751:         MOVEM   TAC,TFRSEC(DDB)
752: 
753: RERITE: MOVEI   TAC,DWRITE!IOPCHN
754:         MOVSM   TAC,TFRCTL(DDB)
755:         JRST    TSTART                          ;WRITE OUT DATA
756: 
757: SETLOS: TDO     IOS,[LOSBIG!IOEND,,IODEND]      ;SCREW THE BASTARD
758:         JRST    DSIOS                           ;STO IOS AND GO UP ONE LEVEL
759: 
760: DIBFO4: PUSHJ   P,ADVBFE                        ;ADVANCE THE BUFFERS
761:         JRST    DIBOFT                          ;NONE LEFT, DO TRANSFER IF ANY WORDS TO TRANSFER
762:         JRST    DIBFO1                          ;LOOK AT ANOTHER BUFFER
    DSKSER page# 0009 next  prev
764: ; DUMP MODE I/O
765: 
766: ;COMMAND LIST IN IOWD FORMAT: (-WDCT)SA-1
767: ;GETS CONVERTED TO 167 FORMAT: (-WDCT)SA
768: ; RETURNS STARTING ADDRESS IN TAC1 AND -WD CT IN TAC
769: 
770: DMPCMD:
771:         MOVEI   AC1,JOBPFI                      ;LOWER LIMIT
772:         MOVE    TAC,UUOPC(J)
773:         TLNN    TAC,USRMOD                      ;MONITOR OP?
774:         MOVEI   AC1,JOBSAV                      ;YES
775:         HLRZ    AC2,PROG                        ;UPPER LIMIT=PROTECTION
776:         LDB     AC3,PSEGN
777:         JUMPE   AC3,DMPGET                      ;AC3 ← HIGH SEGEMENT PROTECT ADDR
778:         HLRZ    AC3,JBTADR(AC3)
779:         ADDI    AC3,400000                      ;UPPER SEGMENT ADDRESSES ARE O.K.
780: 
781: DMPGET:
782: DMPGT1: XCTR    XR,[SKIPN TAC1,(UUO)]   ;GET NEXT COMMAND WORD
783:         JRST    TPOPJ                   ;ZERO TERMINATES
784: DMPGT2: HLRE    TAC,TAC1                ;NEGATIVE WORD COUNT
785:         ANDI    TAC1,-1                 ;FIRST ADDRESS-1
786:         JUMPE   TAC,DMPTCH              ;JUMP IF THIS IS A JUMP COMMAND
787:         ADDI    TAC1,1                  ;REAL STARTING ADDRESS
788:         CAIGE   TAC1,(AC1)              ;ABOVE MINUMUM PROTECT ADDRESS?
789:         JSP     DAT,ADRERR              ;NO. LOSE.
790:         PUSH    P,TAC1                  ;SAVE STARTING ADDRESS
791:         HRRO    TAC,TAC                 ;IN CASE HUGE WD CT
792:         SUB     TAC1,TAC                ;CALCULATE LAST ADDR
793:         CAIG    TAC1,1(AC2)             ;IS IT WITHIN LOWER?
794:         JRST    T1POPJ                  ;YES.  WIN.
795:         CAIG    TAC1,1(AC3)             ;BENEATH TOP OF UPPER?
796:         TRNN    TAC1,400000             ;YES. IN UPPER AT ALL.
797:         JSP     DAT,ADRERR              ;NO TO ONE OF ABOVE
798: T1POPJ: POP     P,TAC1                  ;GET STARTING ADDRESS BACK
799:         POPJ    P,                      ;WIN
800: 
801: DMPTCH: HRR     UUO,TAC1                ;SET ADDRESS OF NEXT COMMAND
802:         CAIG    TAC1,(AC1)              ;ABOVE PROTECTED AREA?
803:         JSP     DAT,ADRERR              ;NO. LOSE
804:         CAIG    TAC1,(AC2)              ;ADDRESS OK?
805:         JRST    DMPGET                  ;YES.
806:         CAIG    TAC1,1(AC3)             ;BENEATH TOP OF UPPER?
807:         TRNN    TAC1,400000             ;YES. IN UPPER AT ALL?
808:         JSP     DAT,ADRERR              ;NO TO ONE OF ABOVE
809:         JRST    DMPGET
810: 
811: DDCALC: MOVE    AC1,USETP(DDB)          ;LOCATE END OF BLOCK
812:         ADDI    AC1,RCPBLK-1            ;CONTAINING USETP
813:         MOVEI   DAT,RCPBLK
814:         IDIVM   AC1,DAT                 ;SEE US CLEVERLY AVOID A REMAINDER !
815:         IMULI   DAT,RCPBLK
816:         LSH     DAT,RECWSH              ;CONVERT TO WORD COUNT.
817:         POPJ    P,
    DSKSER page# 0010 next  prev
819: ;DUMP MODE INPUT
820: 
821: DDMPI:  TLNN    IOS,READB!WRITEB!ALTERB
822:         JRST    ENOLUK
823:         JSP     AC1,TSTEOF              ;SEE IF IMMEDIATE EOF
824:         JRST    DDMIEF                  ;YES. TELL LOSER.
825:         TLZ     IOS,IO                  ;FLAG INPUT
826:         TLO     IOS,GOBIT               ;MAKE US UNSTOPPABLE.
827:         MOVEM   IOS,DEVIOS(DDB)
828:         PUSHJ   P,DDICOM
829: 
830: DDXIT:  PUSHJ   P,RTNCOR                ;RETURN COMMAND BUFFER TO FREE STG
831:         TRNN    IOS,IODERR!IODTER       ;IF DATA OR DEVICE ERROR, LET USER SEE IT!
832:         TLNN    IOS,LOSBIG              ;ELSE IF BAD RETRIEVAL PRINT MESSAGE
833:         JRST    DPOPJ
834:         JRST    EGARB
835: 
836: DDICOM: PUSHJ   P,GETCOR                ;GET CORE FOR COMMAND LIST NOW
837:         PUSHJ   P,GETRET                ;GET GROUP DIRECTORY
838:         JRST    SETLOS                  ;BAD RETRIEVAL
839: DDICO2: PUSHJ   P,DMPCMD                ;GET AN IOWD
840:         MOVEM   TAC1,CORFAD(DDB)        ;SAVE STARTING ADDRESS
841:         MOVE    AC1,USETP(DDB)
842:         SUBI    AC1,1
843:         ASH     AC1,RECWSH              ;7
844:         MOVEM   AC1,DSKFAD(DDB)
845:         SUB     AC1,TAC                 ;CALC DISK LAST ADDR
846:         CAMG    AC1,FILLNG(DDB)
847:         JRST    DDICO3
848:         TLO     IOS,IOEND
849:         MOVE    AC1,FILLNG(DDB)         ;STOP AT EOF
850: DDICO3: MOVEM   AC1,DSKLAD(DDB)
851: 
852: DDIC0:  HLRS    DMPBUF(DDB)
853: DDIC1:  PUSHJ   P,DDCALC                ;FIND BLOCK END.
854:         CAMLE   DAT,DSKLAD(DDB)         ;COMPARE WORD COUNTS.
855:         MOVE    DAT,DSKLAD(DDB)
856:         SUB     DAT,DSKFAD(DDB)         ;THIS GIVES TFR WORD COUNT.
857:         MOVN    TAC,DAT
858:         HRR     TAC1,CORFAD(DDB)
859:         HLRZ    TEM,PROG
860:         CAIG    TAC1,(TEM)
861:         JRST    DDIC2
862:         LDB     TEM,PSEGN
863:         HRRZ    TEM,JBTADR(TEM)
864:         TRZ     TAC1,400000             ;FOR 256K IT MUST BE DONE-RPH 4-17-72
865:         ADDI    TAC1,(TEM)
866:         JRST    DDIC3
867: 
868: DDIC2:  ADDI    TAC1,(PROG)             ;RELOCATE
869: DDIC3:  HRL     TAC1,TAC                ;PUT IN -WD COUNT
870:         AOS     TEM,DMPBUF(DDB)
871:         MOVEM   TAC1,-1(TEM)            ;ENTER IN COMMAND LIST
872:         ADDM    DAT,CORFAD(DDB)         ;BUMP FIRST ADDR BY WD CT
873:         ADDB    DAT,DSKFAD(DDB)
874:         ADDI    DAT,RECSIZ+RECSIZ-1     ;ROUND UP TO RECORD
875:         ASH     DAT,-RECWSH
876:         MOVE    TAC,USETP(DDB)
877:         MOVEM   DAT,USETP(DDB)
878:         PUSHJ   P,LR2BLK
879:         JUMPE   TAC,SETLOS              ;NON EX = BAD RETRIEVAL
880:         PUSHJ   P,BKMAP
881:         MOVEM   TAC,(TEM)
882:         AOS     TEM,DMPBUF(DDB)         ;BUMP COMMAND POINTER
883:         HLRZ    TAC,TEM                 ;END CHECK COMMAND LIST
884:         CAIGE   TAC,-100(TEM)
885:         JRST    EDMPLS                  ;ILL FMT COMMAND LIST.
886:         MOVE    TAC,DSKFAD(DDB)
887:         CAME    TAC,DSKLAD(DDB)         ;SEE IF REQUEST COMPLETED
888:         PUSHJ   P,TSTRET                ;START XFER IF GRP OFLOW
889:         JRST    DDIGO                   ;RTVL NOT IN MEANS GRP OFLOW
890:         JRST    DDIC1                   ;NO OFLOW YET, DO MORE
891: 
892: DDIGO:  MOVEI   DAT,DIDMPI              ;START I-LEVEL SUBR
893:         PUSHJ   P,QEWAIT
894:         TRNE    IOS,IODERR!IODTER       ;IF DEVICE SCREW-UP
895:         POPJ    P,                      ;QUIT NOW!
896:         MOVE    TAC,DSKFAD(DDB)
897:         CAME    TAC,DSKLAD(DDB)
898:         JRST    DDIC0                   ;WORDS LEFT; DO ANOTHER GROUP
899:         TLNN    IOS,IOEND               ;END FILE?
900:         AOJA    UUO,DDICO2              ;NO, DO NEXT IOWD
901: 
902: DDMIEF: IOR     IOS,[XWD IOEND,IODEND]
903:         JRST    DSIOS                   ;STORE IOS, AND POPJ.
904: 
905: ;*** INTERRUPT SUBR ***
906: 
907: DIDMPI: MOVE    TEM,DMPBUF(DDB)
908:         HLRS    TEM
909:         MOVEI   TAC1,IOPCHN
910:         MOVSM   TAC1,TFRCTL(DDB)
911:         LDB     AC1,PUNIT
912: DIDMI1: MOVE    TAC1,(TEM)              ;WCMA FROM COMMAND LIST
913:         MOVEM   TAC1,TFRIOW(DDB)
914:         MOVE    TAC1,1(TEM)
915:         ADD     TAC1,BFSETS(AC1)
916:         MOVEM   TAC1,TFRSEC(DDB)
917:         PUSHJ   P,TSTART
918:         ADDI    TEM,2
919:         CAMGE   TEM,DMPBUF(DDB)
920:         JRST    DIDMI1
921: 
922: DIDMI2: MOVE    TAC,DSKFAD(DDB)
923:         CAMN    TAC,DSKLAD(DDB)         ;IF LAST TFR,JUST RETURN
924:         POPJ    P,
925:         SKIPN   TAC,DNXTGP(DDB)         ;ELSE GET RTVL FOR NEXT GRP.
926:         JRST    DMIEF1                  ;FLAG END
927:         PUSHJ   P,BK2SEC
928:         LDB     TAC1,PUNIT
929:         ADD     TAC,BFSETS(TAC1)
930:         MOVEM   TAC,TFRSEC(DDB)
931:         MOVEI   TAC,DSKDAT(DDB)         ;READ RIGHT INTO DDB
932:         HRLI    TAC,-SECSIZ
933:         MOVEM   TAC,TFRIOW(DDB)
934:         PUSHJ   P,TSTART
935:         PUSHJ   P,AUDCHK
936:         POPJ    P,
937: 
938: DMIEF1: TLO     IOS,IOEND
939:         POPJ    P,
    DSKSER page# 0011 next  prev
941: ;DUMP MODE OUTPUT
942: 
943: DDMPO:  TLNN    IOS,WRITEB!ALTERB
944:         JRST    ENOENT
945:         TLO     IOS,IO!GOBIT            ;FLAG OUTPUT
946:         MOVEM   IOS,DEVIOS(DDB)
947:         PUSHJ   P,DDOCOM
948:         JRST    DDXIT
949: 
950: DDOCOM: PUSHJ   P,GETCOR                ;GET BUFFER FOR COMMAND LIST
951: DDOCO2: PUSHJ   P,DMPCMD                ;GET IOWD
952:         MOVEM   TAC1,CORFAD(DDB)
953:         MOVE    AC1,USETP(DDB)
954:         SUBI    AC1,1
955:         ASH     AC1,RECWSH
956:         MOVEM   AC1,DSKFAD(DDB)
957:         SUB     AC1,TAC                 ;TAC: -WD CT
958:         MOVEM   AC1,DSKLAD(DDB)
959:         CAMG    AC1,FILLNG(DDB)         ;DID FILE GROW?
960:         JRST    DDOC0
961:         MOVEM   AC1,FILLNG(DDB)
962:         TLO     IOS,HDRDIF              ;INDICATE NEW FILLNG TO SPREAD.
963:         MOVEM   IOS,DEVIOS(DDB)         ;GET IT INTO THE DDB
964: 
965: DDOC0:  HLRS    DMPBUF(DDB)
966: DDOC1:  PUSHJ   P,MAKBLK
967:         JUMPE   TAC,SETLOS              ;NON EX = BAD RETRIEVAL
968:         PUSHJ   P,DDCALC                ;LOCATE BLOCK'S END.
969:         CAMLE   DAT,DSKLAD(DDB)         ;COMPARE WORD COUNTS.
970:         MOVE    DAT,DSKLAD(DDB)
971:         SUB     DAT,DSKFAD(DDB)         ;THIS GIVES TFR WORD COUNT.
972:         MOVN    TAC,DAT
973:         HRR     TAC1,CORFAD(DDB)
974:         HRL     TAC1,TAC                ;PUT IN -WD COUNT
975:         AOS     TEM,DMPBUF(DDB)
976:         MOVEM   TAC1,-1(TEM)            ;ENTER IN COMMAND LIST
977:         ADDM    DAT,CORFAD(DDB)         ;UPDATE STARTING ADDRESSES
978:         ADDB    DAT,DSKFAD(DDB)
979:         ADDI    DAT,RECSIZ+RECSIZ-1
980:         ASH     DAT,-RECWSH
981:         MOVE    TAC,USETP(DDB)
982:         MOVEM   DAT,USETP(DDB)
983:         PUSHJ   P,LR2BLK
984:         JUMPE   TAC,SETLOS              ;NON EX = BAD RETRIEVAL
985:         PUSHJ   P,BKMAP
986:         MOVEM   TAC,(TEM)
987:         AOS     TEM,DMPBUF(DDB)
988:         HLRZ    TAC,TEM
989:         CAIGE   TAC,-100(TEM)           ;END CHK COMND LIST
990:         JRST    EDMPLS                  ;ILL FMT COMMAND LIST.
991:         MOVE    TAC,DSKFAD(DDB)
992:         CAMN    TAC,DSKLAD(DDB)         ;ALL WORDS ACCOUNTED FOR?
993:         JRST    DDMPO4                  ;YES, DO OUTPUT
994:         PUSHJ   P,TSTRET                ;RTVL NOT IN MEANS GRP OFLOW
995:         JRST    DDMPO3                  ;GRP OFLOW, DO OUTPUT
996:         JRST    DDOC1                   ;NO OFLOW, DO NEXT BLOCK
997: 
998: DDMPO3: SKIPE   DNXTGP(DDB)             ;NEXT GROUP EXIST?
999:         JRST    DDMPO4                  ;YES, OUTPUT THIS BLOCK.
1000:         PUSHJ   P,ASNGRP                ;NO, SET IT UP.
1001: 
1002: DDMPO4: MOVEI   DAT,DIDMPO              ;WRITE THIS GROUP OUT.
1003:         PUSHJ   P,QEWAIT
1004:         TRNE    IOS,IODERR!IODTER
1005:         POPJ    P,                      ;QUIT NOW IF ERROR!
1006:         MOVE    TAC,DSKFAD(DDB)
1007:         CAME    TAC,DSKLAD(DDB)
1008:         JRST    DDOC0                   ;WORDS LEFT, DO ANOTHER GROUP
1009:         AOJA    UUO,DDOCO2              ;GET NEXT IOWD
1010: 
1011: ;***INTERRUPT SUBR***
1012: 
1013: DIDMPO: TLZE    IOS,PNTDIF
1014:         PUSHJ   P,SPREAD
1015:         MOVE    TEM,DMPBUF(DDB)
1016:         HLRS    TEM
1017:         MOVEI   TAC1,DWRITE!IOPCHN
1018:         MOVSM   TAC1,TFRCTL(DDB)
1019: DIDMO1: MOVE    TAC1,(TEM)
1020:         HLRZ    DAT,PROG
1021:         CAIL    DAT,(TAC1)
1022:         JRST    DIDMO2
1023:         LDB     DAT,PSEGN
1024:         TRZ     TAC1,400000             ;BELIEVE ME FRED THIS IS THE ONLY WAY!
1025:         HRRZ    DAT,JBTADR(DAT)         ;RPH 4-17-72
1026:         ADDI    TAC1,(DAT)              ;RELOCATE TO UPPER
1027:         JRST    DIDMO3
1028: 
1029: DIDMO2: ADDI    TAC1,(PROG)
1030: DIDMO3: MOVEM   TAC1,TFRIOW(DDB)
1031:         MOVE    TAC1,1(TEM)
1032:         LDB     DAT,PUNIT
1033:         ADD     TAC1,BFSETS(DAT)
1034:         MOVEM   TAC1,TFRSEC(DDB)
1035:         PUSHJ   P,TSTART
1036:         ADDI    TEM,2
1037:         CAMGE   TEM,DMPBUF(DDB)
1038:         JRST    DIDMO1
1039:         POPJ    P,
    DSKSER page# 0012 next  prev
1041: ;BOTH INPUT & OUTPUT CLOSE ARE ALWAYS CALLED FROM UUOCON.
1042: ;CLOSE INPUT.
1043: 
1044: DCLOSI: TLNE    IOS,IOSET
1045:         JRST    DSIOS                   ;FAKE FOR USETI, RETURN.
1046:         TLZE    IOS,READB
1047:         TLZN    IOS,DELETB              ;DELETE FILE (SUBSEQUENT ENTER)?
1048:         JRST    DSIOS                   ;NO, JUST RETURN.
1049:         JSP     AC1,ACCESS              ;IS ANYONE ELSE READING?
1050:         JRST    DSIOS                   ;YES, DON'T DELETE.
1051:         JFCL                            ;IRRELEVANT
1052:         PUSHJ   P,GOSET                 ;MAKE US UNSTOPPABLE.
1053:         MOVE    TAC,FILLOC(DDB)         ;NO ONE ELSE LOOKING, SO...
1054:         PUSHJ   P,DELETE                ;DELETE FILE.
1055:         PUSHJ   P,CUSATO                ;OUT SAT IF NEEDED.
1056:         PUSHJ   P,WSYNC                 ;WAIT FOR IT
1057:         JRST    DPOPJ
1058: 
1059: 
1060: ;CLOSE OUTPUT
1061: 
1062: DCLOSO: TLNN    IOS,WRITEB!ALTERB
1063:         JRST    DCLSDD                  ;NO ENTER, BLAST DDB
1064:         PUSHJ   P,GOSET
1065:         TLNN    DDB,OUTBFB+OUTPB        ;ANY OUTPUT BUFFERS SET UP?
1066:         JRST    DCLSO3                  ;NO.  NOTHING TO FLUSH  --ME
1067:         LDB     TAC,PIOMOD              ;#-EATING APRSER SHOULD DO THIS
1068:         CAIGE   TAC,DR
1069:         PUSHJ   P,OUT                   ;LAST OUTPUT FOR BUFFERED MODES
1070: DCLSO3: PUSHJ   P,WAIT1                 ;FINISH IT 
1071:         TLNE    IOS,IOSET               ;WERE WE CALLED FROM USETO?
1072:         JRST    DPOPJ                   ;YES. CLEAR GOBIT AND RETURN.
1073:         MOVEI   DAT,DCLOI
1074:         TLNE    IOS,PNTDIF!HDRDIF       ;RTVL CORRECT?
1075:         PUSHJ   P,NEWAIT                ;NO, GO FIX
1076:         PUSHJ   P,RTNCOR                ;IF OUTPUT ABORTED
1077: 
1078: ;FILE & POINTERS NOW OUT; FIX UP UFD
1079: 
1080: DCLSO1: TLNN    IOS,NTRUFD              ;CHANGE UFD?
1081:         JRST    DCLSO2                  ;NO, NEW FILE; UFD POINTS TO IT
1082: DCLSO9: TLZ     IOS,DELETB              ;NEW VERSION OF OLD FILE.
1083:         MOVSI   AC2,DELETB
1084:         JSP     AC1,ACCESS              ;MARK READERS OF OLD FILE...
1085:         JRST    DCLSOR                  ;TO DELETE IT WHEN THRU
1086:         JRST    ELOSE                   ;SHOULD BE JUST US WRITING
1087:         PUSHJ   P,UFDSRC                ;GET UFD RTVL
1088:         MOVEI   DAT,DRAUFD              ;USE RENAME CODE TO...
1089:         PUSHJ   P,QEWAIT                ;CHANGE UFD TO NEW FILE
1090:         TLZE    IOS,DELETB              ;WAS ANYONE READING?
1091:         JRST    DCLSO2                  ;YES, DON'T DELETE NOW
1092: DCLSOC: MOVE    TAC,SRCLOC(DDB)         ;OLD FILE LOCATION
1093: DCLSOD: PUSHJ   P,DELETE                ;DELETE IT
1094:         LDB     TAC,PUNIT
1095:         TRNE    IOS,IOIMPM!IODERR
1096:         JUMPN   TAC,SATGLZ              ;WRITE LOCKED UDP
1097: DCLSO2: PUSHJ   P,CUSATO                ;OUT SAT IF NEEDED
1098:         PUSHJ   P,WSYNC                 ;WAIT FOR IT
1099: 
1100: DCLSDD: TDNE    IOS,[XWD DEVSBB,IOACT]
1101:         SETZB   IOS,DEVIOS(DDB)         ;THIS SHOULDN'T HAPPEN, BUT IT DOES.
1102:         MOVSI   TAC,DEVIBF
1103:         ANDCAM  TAC,DEVCMR(DDB)
1104:         PUSHJ   P,RTNCOR
1105:         SETZM   ACCNAM(DDB)
1106:         HRLI    TAC,ACCNAM(DDB)
1107:         HRRI    TAC,ACCNAM+1(DDB)
1108:         BLT     TAC,DDEND-1(DDB)
1109:         ANDI    IOS,GARBIT!DMPBIT!17
1110:         JRST    DPOPJ
1111: 
1112: DCLSOR: IORM    AC2,DEVIOS(TAC)         ;FOUND READER, MARK TO DELETE
1113:         TLO     IOS,DELETB              ;FLAG FILE STILL IN USE
1114:         JRST    ACCES1                  ;KEEP LOOKING
1115: 
1116: 
1117: ; *** INTERRUPT LEVEL ROUTINE ***
1118: ; UPDATE FIRST RTVL (LENGTH) &∨ LAST (PTRS).
1119: 
1120: DCLOI:  TLZN    IOS,HDRDIF              ;HEADER PTRS OK?
1121:         JRST    DCLSO5                  ;YES, FIX LAST PTRS
1122:         MOVEI   TAC,1                   ;HEADER IS WRONG
1123:         CAMN    TAC,DGRP1R(DDB)         ;LOOKING AT HEADER?
1124:         JRST    DCLSO5                  ;YES, GO FIX IT
1125: ;       TLNN IOS,PNTDIF         ;LAST POINTERS OK?
1126:         PUSHJ   P,DCLSO5                ;NO, FIX THEM TOO
1127:         MOVEI   TAC,1
1128:         MOVEM   TAC,USETP(DDB)
1129:         PUSHJ   P,GGRETI                ;GET HEADER POINTERS
1130: DCLSO5: PUSHJ   P,AUDINF                ;FIX UP
1131: DCLSO4: PUSHJ   P,SPREAD                ;OUTPUT POINTERS
1132:         TLNE    IOS,HDRDIF              ;WERE BLOCKS REASSIGNED AT INTERRUPT LEVEL?
1133:         JRST    DCLOI                   ;YES.
1134:         POPJ    P,
    DSKSER page# 0013 next  prev
1136: ;RELEASE UUO, CALL RESET, AND CALL EXIT
1137: 
1138: DRELES: PUSHJ   P,WAIT1                 ;MAKE SURE RESET WAITS FOR DISK TO STOP
1139:         PUSHJ   P,DCLOSI                ;MAYBE DELETE FILE WE READ.
1140:         TLNN    IOS,WRITEB              ;IS A PARTIALLY WRITTEN FILE?
1141:         JRST    DCLSDD                  ;NO, CLEAR DDB.
1142:         PUSHJ   P,GOSET                 ;WE GET HERE ON RESET ONLY.
1143:         MOVEI   DAT,DCLOI               ;MAKE SURE RETRIEVAL IS OUT.
1144:         PUSHJ   P,QEWAIT
1145:         MOVE    TAC,FILLOC(DDB)
1146:         TLNE    IOS,NTRUFD
1147:         JRST    DCLSOD                  ;OLD FILE EXISTS, DELETE NEW
1148:         PUSHJ   P,UFDSRC                ;NEW FILE, DELETE NAME
1149:         SETZM   ACCNAM(DDB)
1150:         MOVEI   DAT,DRAUFD
1151:         PUSHJ   P,QEWAIT
1152:         JRST    DCLSOC                  ;THEN DELETE FILE.
1153: 
1154: ;USETI, USETO, UGETF.
1155: 
1156: DSETI:  TLNN    IOS,READB
1157:         JRST    ENOLUK
1158:         PUSH    P,UUO                   ;SAVE THIS FOR LATER
1159:         HRRI    UUO,CLSOUT              ;DON'T AFFECT OUTPUT
1160: DSETC0: PUSHJ   P,DSETC                 ;FLUSH BUFFERS, FINISH IO
1161:         POP     P,TAC1
1162:         HRRE    TAC1,TAC1
1163:         ADD     TAC1,DOFFST(DDB)        ;ADD OFFSET
1164:         SKIPG   TAC1                    ;IF LESS THAN 1
1165:         MOVEI   TAC1,1                  ;MAKE IT 1 (LOSERS)
1166:         PUSHJ   P,DGETL                 ;GET RECORD EOF+1
1167:         CAMLE   TAC,TAC1                ;SET TO END IF NOT IN FILE
1168:         SKIPA   TAC,TAC1                ;IT'S OK - USE IT
1169: DSETC1: TDOA    IOS,[XWD IOEND,IODEND]  ;OFF END
1170:         TDZ     IOS,[XWD IOEND,IODEND]  ;INSIDE FILE, NO EOF
1171:         MOVEM   TAC,USETP(DDB)          ;STORE NEW POINTER
1172:         TLNE    IOS,WRITEB!ALTERB       ;COULD HE BE WRITING?
1173:         SKIPN   TAC1,DGRP1R(DDB)        ;AND DO WE HAVE ANY RETRIEVAL?
1174:         JRST    DSIOS                   ;NOTHING TO DO
1175:         CAIGE   TAC,RCPGRP(TAC1)
1176:         CAIGE   TAC,(TAC1)              ;IS NEW RECORD IN CURRENT RETRIEVAL?
1177:         TLZN    IOS,PNTDIF              ;NO, POINTERS NEED UPDATE?
1178:         JRST    DSIOS                   ;NO UPDATE!
1179:         MOVEI   DAT,DCLSO5
1180:         PUSHJ   P,NEWAIT                ;GO
1181:         JRST    DSIOS                   ;STO IOS AND RETURN
1182: 
1183: 
1184: DSETO:  TLNN    IOS,WRITEB!ALTERB
1185:         JRST    ENOENT
1186:         PUSH    P,UUO
1187:         HRRI    UUO,CLSIN               ;LEAVE INPUT ALONE
1188:         JRST    DSETC0
1189: 
1190: DGETF:  PUSH    P,UUO
1191:         MOVEI   UUO,CLSIN!CLSOUT
1192:         TLNE    IOS,READB
1193:         TRZ     UUO,CLSIN
1194:         TLNE    IOS,WRITEB!ALTERB
1195:         TRZ     UUO,CLSOUT
1196:         PUSHJ   P,DSETC                 ;FLUSH BUFFERS, FINISH IO
1197:         POP     P,UUO
1198:         PUSHJ   P,DGETL                 ;NOW GET END OF FILE
1199:         MOVE    TAC1,TAC                ;SAVE COPY
1200:         SUB     TAC1,DOFFST(DDB)        ;UN-OFFSET FOR LOSER
1201:         XCTR    XRW,[HRRM TAC1,(UUO)]   ;GIVE TO USER
1202:         JRST    DSETC1                  ;AND USETP TO THERE
1203: 
1204: DGETL:  MOVE    TAC,FILLNG(DDB)         ;FIND NEXT FREE RECORD
1205: DGETL1:ADDI    TAC,RECSIZ-1            ;ROUND UP TO NEXT FULL RECORD
1206:         ANDCMI  TAC,RECSIZ-1
1207:         ASH     TAC,-RECWSH
1208:         ADDI    TAC,1
1209:         POPJ    P,
1210: 
1211: DSETC:  MOVSI   IOS,IOSET               ;FLAG FOR CLOSE
1212:         IORB    IOS,DEVIOS(DDB)         ;FOR WAIT1 AT CLSOUT (UUOCON)
1213:         PUSH    P,DDB
1214:         PUSHJ   P,CLOSE1                ;TO FLAG BUFFERS EMPTY.
1215:         POP     P,DDB                   ;RE-OPEN
1216:         TLZ     IOS,IOSET               ;MAKE SURE THIS IS OFF!
1217:         MOVEM   IOS,DEVIOS(DDB)
1218:         HLLM    DDB,USRJDA(UCHN)        ;AND REPLACE IN USER TABLE
1219:         POPJ    P,
    DSKSER page# 0014 next  prev
1221: ;MTAPE UUO -- BY R. HELLIWELL -- 16 JAN 72
1222: 
1223: ;       IF FIRST WORD = SIXBIT/GODMOD/  :
1224: ;               THEN SECOND WORD IS DISPATCH INTO GODDIS
1225: ;               SEE ROUTINE FOR FURTHER DESCRIPTION
1226: ;
1227: ;       ANYTHING ELSE IN FIRST WORD GETS THE USET POINTER!
1228: 
1229: DGETW:  PUSHJ   P,WAIT1                 ;FINISH ANYTHING IN PROGRESS
1230:         XCTR    XR,[MOVE TAC,(UUO)]     ;PICK UP FIRST ARG!!!
1231:         CAMN    TAC,[-1]                ;OLD MTAPE?
1232:         JRST    UUOERR                  ;YES: OLD FORM OF MTAPE NO LONGER EXISTS
1233:         CAME    TAC,['GODMOD']          ;REQUESTING NEW GOD MODE
1234:         JRST    GETPNT                  ;NO. GET THE USET POINTER
1235:         ADDI    UUO,1
1236:         XCTR    XR,[MOVE TAC,(UUO)]
1237:         CAIL    TAC,GODLEN              ;OFF END OF TABLE?
1238:         JRST    UUOERR                  ;YES, TELL HIM HE LOST
1239:         SKIPL   GODDIS(TAC)             ;PROTECTED MTAPE?
1240:         JRST    DGETW1                  ;NO, DISPATCH
1241:         MOVE    TAC1,JBTPRV(J)          ;YES, CHECK PRIV.
1242:         TLNN    TAC1,INFPRV             ;USE THIS PRIVILEGE
1243:         JRST    UUOERR                  ;LOSER
1244: DGETW1: MOVE TAC1,GODDIS(TAC)           ;IN CASE UDP, SEE IF WE NEED SAT IN
1245:         TLNN TAC1,200000                ;DEPENDS ON WHICH MTAPE
1246:         JRST    @GODDIS(TAC)            ;NO, JUST DISPATCH
1247:         PUSH P,TAC                      ;YES, DO IT
1248:         PUSHJ P,SATGET
1249:         POP P,TAC
1250:         JRST    @GODDIS(TAC)
1251: 
1252: ;IF SIGN BIT ON IN TABLE, MUST HAVE INFPRV TO DO THIS UUO!!!!!!!!
1253: ;200000,,0 BIT MEANS UDP SAT TABLE MUST BE IN CORE
1254: 
1255: GODDIS:         GETPNT                  ;0      GET USET POINTER
1256:         400000,,GDREAD                  ;1      READ DISK BLOCK
1257:                 GDWRIT                  ;2      WRITE DISK BLOCK
1258:         200000,,SETSAT                  ;3      SET SAT BIT
1259:         200000,,CLRSAT                  ;4      CLEAR SAT BIT
1260:         200000,,SATRD                   ;5      READ WORDS FROM SAT TABLE
1261:         200000,,SATWRT                  ;6      WRITE WORDS IN SAT TABLE
1262:         200000,,SATFRC                  ;7      FORCE OUT SAT
1263:         400000,,FILINF                  ;10     READ 5 WORDS OF FILE INFO
1264:                 WRTINF                  ;11     WRITE 5 WORDS OF FILE INFO
1265:                 DIAGL                   ;12     DIAGNOSTIC LOAD
1266:                 DIAGW                   ;13     DIAGNOSTIC WRITE
1267:                 GETRTR                  ;14     GET FILE RETRIEVAL DATA
1268:                 INFCOM                  ;15     COMPARE A WORD IN DQINFO
1269:                 ADDBLK                  ;16     FIX RETRIEVAL TO INCLUDE AN EXISTING BLOCK
1270:                 FILEUP                  ;17     UPDATE ALL POINTERS AND HEADER INFO
1271:                 RDOFF                   ;20     READ FILE RECORD OFFSET
1272:                 WRTOFF                  ;21     SET FILE RECORD OFFSET
1273:         200000,,TKSFRE                  ;22     HOW MANY FREE TRACKS LEFT
1274:         200000,,VOLID                   ;23     TELL USER THE SATID
1275: GODLEN←←.-GODDIS
1276: 
1277: ;       MTAPE CHN,[     ≠-1 ∧ ≠SIXBIT/GODMOD/   ]
1278: ;  OR
1279: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1280: ;                       0               ];POINTER COMES BACK HERE
1281: 
1282: GETPNT: MOVE    TAC,USETP(DDB)          ;GET USET POINTER
1283:         SUB     TAC,DOFFST(DDB)         ;DO OFFSET
1284:         XCTR    XW,[MOVEM TAC,(UUO)]    ;AND GIVE IT TO USER
1285:         POPJ    P,
1286: 
1287: ;CHECK DISK ABSOLUTE WRITE PRIVILEGE
1288: DGODZ:  MOVSI   AC1,DAWPRV
1289:         TDNN    AC1,JBTPRV(J)           ;SKIP IF DISK ABSOLUTE WRITE PRIV
1290:         JRST    UUOERR                  ;LOSER
1291:         POPJ    P,
    DSKSER page# 0015 next  prev
1293: ;       GDWRIT, GDREAD
1294: ;CALL:
1295: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1296: ;                       1=READ 2=WRITE
1297: ;                       IOWD WC,MA
1298: ;                       XWD S <RECORD #>,<DISK BLOCK ADDRESS>   ]
1299: ;       IO ERROR RETURN
1300: ;       SUCCESS RETURN
1301: ;IF THE SIGN BIT (S) IS ON IN THE 4TH WORD THEN THIS TRANSFER WILL BE
1302: ;TO ONE OF THE EXTRA TRACKS AT THE END OF PACK 0.  THE BLOCK ADDRESS
1303: ;SHOULD BE RELATIVE TO THE END OF THE PACK.
1304: 
1305: GDWRIT: XCTR    XR,[HRRZ TAC,2(UUO)]    ;MUST NOT WRITE SAT DIRECTLY
1306:         XCTR XR,[SKIPL 2(UUO)]          ;DON'T BE FAKED OUT BY XTRA CYL WRITE
1307:         JUMPE   TAC,UADRER              ;(DON'T BE FOOLED BT A RECORD # - REG)
1308:         PUSHJ   P,DGODZ                 ;IS HE LEGAL?
1309:         SKIPA   TAC,[DWRITE!IOPCHN]     ;MAKE IT A WRITE
1310: GDREAD: MOVEI   TAC,IOPCHN              ;READ
1311:         MOVSM   TAC,TFRCTL(DDB)         ;WHICH DIRECTION
1312:         XCTR    XR,[HLRZ TAC,1(UUO)]    ;MAKE SURE ITS NOT TIC
1313:         JUMPE   TAC,UADRER              ;LOSE?
1314:         PUSHJ   P,MTPACK                ;CHECK AND RELOCATE IOWD!
1315:         LDB     TAC1,PUNIT              ;GET UNIT (DSK OR UDP?)
1316:         XCTR    XR,[SKIPGE TAC,2(UUO)]  ;PICK UP DISK ADDRESS
1317:         JRST    GDRD1                   ;XTRA CYL TRANSFER
1318:         ANDI    TAC,-1
1319:         CAMLE   TAC,LSTRKT(TAC1)        ;MUST BE IN RANGE FOR THIS DEVICE
1320:         POPJ    P,                      ;LET THE USER FIGURE OUT WHAT'S WRONG. (REG)
1321: GDRD2:  LSH     TAC,6                   ;POSITION FOR TRACK ADDRESS
1322:         ADD     TAC,BFSETS(TAC1)
1323:         XCTR    XLB,[LDB TAC1,[POINT 6,2(UUO),17]]      ;GET RECORD #
1324:         CAILE   TAC1,RCPBLK             ;LEGAL RECORD?
1325:         JRST    UADRER
1326:         IOR     TAC,TAC1                ;MERGE ADDRESS
1327:         XCTR    XR,[SKIPGE 2(UUO)]
1328:         TLO     TAC,200000              ;MARK AS XTRA CYL PACK 0 OP
1329:         MOVEM   TAC,TFRSEC(DDB)         ;STUFF INTO DDB
1330:         XCTR    XR,[HLRO TAC,1(UUO)]    ;GET WC AGAIN
1331:         IMULI   TAC1,RECSIZ
1332:         SKIPE   TAC1
1333:         SUBI    TAC1,RECSIZ-SECSIZ
1334:         SUB     TAC1,TAC                ;AND "ADD" WC
1335:         CAILE   TAC1,BLKWDS             ;RUN OFF END OF BLOCK?
1336:         JRST    UADRER
1337:         PUSHJ   P,GOSET                 ;MAKE US UNSTOPPABLE
1338:         SETOM   DDLOC(DDB)              ;DISABLE DSKQCK
1339:         MOVEI   DAT,TSTART              ;JUST DO OP
1340:         PUSHJ   P,QEWAIT                ;DO IT
1341:         SETZM   DDLOC(DDB)
1342: DEPOPJ: TRNE    IOS,IODERR!IODTER       ;ANY ERRORS?
1343:         JRST    DPOPJ                   ;YES, NO SKIP
1344:         JRST    DPOPJ1                  ;NO, SKIP RETURN
1345: 
1346: MTPACK: XCTR    XR,[HRRZ TAC1,1(UUO)]   ;PICK UP ADDRESS
1347:         ADDI    TAC1,1                  ;MAKE IT HONEST
1348:         PUSHJ   P,RELOCA                ;ADDRESS CHECK AND RELOCATE
1349:         JRST    UADRER
1350:         HRRM    TAC1,TFRIOW(DDB)        ;SAVE IN DDB
1351:         MOVE    TAC,TFRCTL(DDB)         ;GET MAGIC BIT
1352:         TLNN    TAC,DWRITE              ;IS IT WRITE?
1353:         JUMPL   TAC1,UADRER             ;NO, MUST HAVE WRITE (IN CORE) PERMISSION
1354:         XCTR    XR,[HRRZ TAC1,1(UUO)]
1355:         XCTR    XR,[HLRO TAC,1(UUO)]
1356:         SUB     TAC1,TAC                ;COMPUTE LAST ADDRESS OF TRANSFER
1357:         PUSHJ   P,RELOCB                ;ADDRESS CHECK, RELOCATE AND TEST SAME SEGMENT
1358:         JRST    UADRER
1359:         XCTR    XR,[HLLZ TAC1,1(UUO)]
1360:         HLLM    TAC1,TFRIOW(DDB)        ;SAVE IN DDB
1361:         POPJ    P,                      ;OK
1362: 
1363: GDRD1:  ANDI    TAC,-1
1364:         CAIGE   TAC,NXTRA0*TRKCYL*BKPTRK
1365:         JUMPE   TAC1,GDRD2              ;LEGAL, BUT NOT FOR UDPS
1366:         JRST    UADRER
    DSKSER page# 0016 next  prev
1368: ;       SETSAT, CLRSAT
1369: ;CALL:
1370: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1371: ;                       3=SET BIT       4=CLEAR BIT
1372: ;                       DISK ADDRESS]
1373: ;
1374: ;       CLEAR OR SET SAT BIT CORRESPONDING TO DISK ADDRESS
1375: 
1376: SETSAT: SKIPA   AC2,[MRKBLK]
1377: CLRSAT: MOVEI   AC2,RTNBLK
1378:         PUSHJ   P,DGODZ                         ;MUST BE GOD TO TWIDDLE BITS
1379:         LDB     TAC1,PUNIT
1380:         XCTR    XR,[SKIPLE TAC,1(UUO)]          ;GET BLOCK ADDRESS
1381:         CAMLE   TAC,LSTBTB(TAC1)                ;IN SAT TABLE?
1382:         JRST    UADRER                          ;NO
1383:         JRST    (AC2)                           ;SET OR CLEAR A BIT, AND POPJ
    DSKSER page# 0017 next  prev
1385: ;       SATWRT, SATRD, SATFRC
1386: ;CALL:
1387: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1388: ;                       5=READ  6=WRITE
1389: ;                       IOWD WC,MA
1390: ;                       RELATIVE ADDRESS IN SAT TABLE]
1391: ;
1392: ; ADDRESS IS RELATIVE TO SATTAB, NOT SATBIT!!!!!
1393: ; READ OR WRITE PORTIONS OF SAT TABLE IN CORE!
1394: 
1395: SATWRT: PUSHJ   P,DGODZ                 ;CHECK FOR GOD
1396:         PUSHJ   P,SATSUP                ;SAT SET UP
1397:         JFCL                            ;DON'T CARE, JUST  READING
1398:         MOVSS   TAC                     ;SWAP POINTERS TO BLT INTO SYSTEM
1399:         ADDI    TAC1,-1(TAC)            ;GET LAST LOC
1400:         BLT     TAC,(TAC1)              ;AND DO BLT
1401:         POPJ    P,
1402: 
1403: SATRD:  PUSHJ   P,SATSUP                ;SAT SET UP
1404:         JRST    UADRER                  ;WRITE PROT, LOSE
1405:         ADDI    TAC1,-1(TAC)            ;GET LAST LOC
1406:         BLT     TAC,(TAC1)              ;GIVE INFO TO LOSER!
1407:         POPJ    P,
1408: 
1409: SATSUP: XCTR    XR,[HRRZ TAC1,1(UUO)]   ;PICKUP USER ADDRESS
1410:         ADDI    TAC1,1                  ;MAKE IT HONEST
1411:         PUSHJ   P,RELOCA                ;ADDRESS CHECK AND RELOCATE
1412:         JRST    UADRER
1413:         JUMPL   TAC1,.+2                ;SKIP AOS IF WRITE PROT
1414:         AOS     (P)                     ;SKIP RETURN
1415:         MOVE    TAC,TAC1                ;SAVE IN TAC
1416:         XCTR    XR,[HLRE AC2,1(UUO)]    ;GET WC
1417:         MOVNS   AC2                     ;MAKE IT POS!
1418:         JUMPLE  AC2,UADRER              ;MUST NOW BE POS!
1419:         XCTR    XR,[HRRZ TAC1,1(UUO)]   ;GET MA AGAIN
1420:         ADD     TAC1,AC2                ;COMPUTE LAST ADDRESS
1421:         PUSHJ   P,RELOCB                ;ADDRESS CHECK AND RELOCATE
1422:         JRST    UADRER
1423:         XCTR    XR,[SKIPGE AC1,2(UUO)]  ;GET RELATIVE SAT ADDRESS
1424:         JRST    UADRER
1425:         MOVE    TAC1,AC2
1426:         ADD     AC2,AC1                 ;GET RELATIVE END OF SAT
1427:         LDB     AC3,PUNIT               ;GET UNIT AS INDEX TO SAT TAB TABLES
1428:         CAMLE   AC2,TSATSZ(AC3)         ;INSIDE SAT?
1429:         JRST    UADRER                  ;NO
1430:         MOVE    AC3,SATADR(AC3)         ;ORIGIN OF SAT FOR THIS DEVICE
1431:         ADDI    AC3,(AC1)               ;FIRST WORD TO TRANSFER
1432:         HRLI    TAC,(AC3)               ;PUT CORE ADDRESS OF FIRST WORD IN TAC
1433:         POPJ    P,                      ;RETURN TO DO BLT
1434: 
1435: ;CALL:
1436: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1437: ;                       7               ]
1438: ;
1439: ;FORCE SAT TABLE TO BE WRITTEN OUT!
1440: 
1441: SATFRC: LDB TAC,PUNIT
1442:         SETOM   SATMOD(TAC)             ;LET ANYBODY FORCE SAT OUT
1443:         PUSHJ P,CUSATO                  ;PUTS OUT THE RIGHT SAT TABLE
1444:         JRST WSYNC                      ;WAIT FOR IT
    DSKSER page# 0018 next  prev
1446: ;       FILINF, WRTINF
1447: ;CALL:
1448: ;       MTAPE CHN,[     SIXBIT/GODMOD
1449: ;                       10
1450: ;                       ADDRESS TO PUT INFO (5 WORDS)   ]
1451: ;       ERROR RETURN, NO LOOKUP DONE
1452: ;       SUCCESS RETURN
1453: 
1454: FILINF: TLNN    IOS,READB                       ;LOOKUP DONE?
1455:         POPJ    P,                              ;NO
1456:         XCTR    XR,[MOVE TAC1,1(UUO)]
1457:         ADDI    TAC1,DQLEN-1                    ;CHECK END OF TRANSFER FIRST
1458:         PUSHJ   P,RELOCA
1459:         JRST    UADRER
1460:         JUMPL   TAC1,UADRER
1461:         XCTR    XR,[MOVE TAC1,1(UUO)]
1462:         PUSHJ   P,RELOCB
1463:         JRST    UADRER
1464:         JUMPL   TAC1,UADRER
1465:         HRLI    TAC1,DQINFO(DDB)                ;GET INFO FROM HERE
1466:         HRRZ    TAC,TAC1
1467:         BLT     TAC1,DQLEN-1(TAC)
1468:         JRST    CPOPJ1
1469: 
1470: ;CALL:
1471: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1472: ;                       11
1473: ;                       ADDRESS OF 5 WORDS TO WRITE INTO RETRIEVAL      ]
1474: ;       ERROR RETURN
1475: ;       SUCCESS RETURN
1476: 
1477: WRTINF: PUSHJ   P,DGODZ
1478:         TDNE    IOS,[XWD DEVSBB,IOACT]
1479:         PUSHJ   P,WAIT1
1480:         SKIPE   FILNAM(DDB)             ;NO FILE TO RENAME?
1481:         TLNE    IOS,DELETB              ;OR GOING AWAY?
1482:         POPJ    P,                      ;LOSSAGE RETURN
1483:         XCTR    XR,[MOVE TAC1,1(UUO)]
1484:         ADDI    TAC1,DQLEN-1
1485:         PUSHJ   P,RELOCA
1486:         JRST    UADRER
1487:         XCTR    XR,[MOVE TAC1,1(UUO)]
1488:         PUSHJ   P,RELOCB
1489:         JRST    UADRER
1490:         HRLM    TAC1,(P)                ;SAVE USER ADDRESS FOR BLT'S
1491:         MOVE    TAC1,JBTSTS(J)
1492:         TLNE    TAC1,JACCT              ;DON'T PRINT THIS FOR LOGIN/OUT
1493:         JRST    LINOUT
1494:         LDB TAC1,PUNIT
1495:         JUMPN TAC1,LINOUT               ;NOR FOR UDP
1496:         PUSHJ   P,DISDATE
1497:         PUSHJ   P,DISERR
1498:         [ASCIZ/WRITE INFO, USER = /]
1499:         DISARG SIX,<PRJPRG(J)>
1500:         [ASCIZ/  PROGRAM = /]
1501:         DISARG SIX,<JOBNAM(J)>
1502:         [ASCIZ/  TTY/]
1503:         DISARG LOC,<JBTLIN(J)>
1504:         [ASCIZ/
1505: FILE = /]
1506:         DISARG SIX,<FILNAM(DDB)>
1507:         [ASCIZ/./]
1508:         DISARG SIX,<FILEXT(DDB)>
1509:         [ASCIZ/[/]
1510:         DISARG SIX,<FILPPN(DDB)>
1511:         [ASCIZ/]
1512: 
1513: /]
1514:         -1
1515: LINOUT: MOVEI   AC3,DQLEN               ;GET BLOCK OF FREE STORAGE
1516:         PUSHJ   P,UFSGET                ;GET IT
1517:         PUSH    P,AC1
1518:         HLLZ    TAC1,-1(P)              ;GET SAVED USER ADDR
1519:         HRR     TAC1,AC1                ;SYSTEM ADDR
1520:         BLT     TAC1,DQLEN(AC1)         ;SAVE WORDS IN FREE STORAGE
1521:         PUSHJ   P,FILEUP                ;FORCE OUT POINTERS IF NECESSARY
1522:         POP     P,SRCTMP(DDB)           ;SAVE ADDRESS
1523:         TRZ     IOS,IODERR!IODTER       ;NO ERRORS YET!
1524:         TLO     IOS,RENAMB              ;LOCK UP FILE WHILE WE'RE IN IT
1525:         PUSHJ   P,GOSET                 ;LEST WE GET STOPPED
1526:         PUSH    P,USETP(DDB)            ;SAVE CURRENT USET
1527:         MOVEI   DAT,WRTINS              ;I SUBR
1528:         PUSHJ   P,NEWAIT
1529:         POP     P,USETP(DDB)            ;RESTORE USET
1530:         MOVE    AC1,SRCTMP(DDB)
1531:         PUSHJ   P,FSGIVE                ;RETURN BLOCK
1532:         TLZ     IOS,RENAMB              ;UNLOCK FILE
1533:         JRST    DEPOPJ
1534: 
1535: ;***** I-SUBR FOR SMEARING OUT 5 WORD CHANGE TO DQINFO *****
1536: WRTINS: MOVE    TAC,FILLOC(DDB)         ;HERE IS WHERE WE START
1537:         PUSHJ   P,NEWFIL                ;INITIALIZE FILE
1538: WRTIN1: PUSHJ   P,GGRETI                ;GET RETRIEVAL IN
1539:         HRLZ    TAC1,SRCTMP(DDB)        ;GET FREE STORAGE ADDRESS
1540:         HRRI    TAC1,DQINFO(DDB)        ;AND DDB ADDRESS
1541:         BLT     TAC1,DQINFO+DQLEN-1(DDB);BLT IN 5 WORDS
1542:         PUSHJ   P,SPREAD                ;SPREAD RET. OVER GROUP
1543:         SKIPN   DNXTGP(DDB)             ;ANOTHER TO GO?
1544:         POPJ    P,
1545:         MOVEI   TAC,RCPGRP              ;INC USET TO NEXT GROUP
1546:         ADDM    TAC,USETP(DDB)
1547:         JRST    WRTIN1                  ;AND LOOP
    DSKSER page# 0019 next  prev
1549: ;       WRTOFF, RDOFF
1550: ;CALL:
1551: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1552: ;                       21
1553: ;                       NEW FIRST RECORD        ]
1554: ;       ERROR RETURN
1555: ;       SUCCESS RETURN
1556: 
1557: WRTOFF: TDNE    IOS,[XWD DEVSBB,IOACT]
1558:         PUSHJ   P,WAIT1
1559:         SKIPE   FILNAM(DDB)             ;NO FILE TO RENAME?
1560:         TLNE    IOS,DELETB              ;OR GOING AWAY?
1561:         POPJ    P,                      ;LOSSAGE RETURN
1562:         TLNE    IOS,WRITEB              ;ALREADY WRITING?
1563:         JRST    WOFFOK                  ;YES, OK
1564:         MOVSI   DAT,100000              ;CHANGE; IS IT LEGAL?
1565:         MOVE    AC2,FILPPN(DDB)
1566:         MOVE    AC3,FILPRO(DDB)
1567:         JSP     AC1,PROTEK
1568: WOFFOK: XCTR    XR,[MOVE TAC1,1(UUO)]   ;GET USER OFFSET REQUEST
1569:         SOJL    TAC1,CPOPJ              ;NORMALIZE AND TEST FOR TO SMALL
1570:         PUSH    P,TAC1
1571:         PUSHJ   P,FILEUP                ;MAKE SURE POINTERS ARE OK
1572:                                         ;BEFORE DIDLING THEM
1573:         POP     P,SRCTMP(DDB)
1574:         TRZ     IOS,IODERR!IODTER       ;NO ERRORS YET!
1575:         TLO     IOS,RENAMB              ;LOCK UP FILE WHILE WE'RE IN IT
1576:         PUSHJ   P,GOSET                 ;LEST WE GET STOPPED
1577:         PUSH    P,USETP(DDB)            ;SAVE CURRENT USET
1578:         MOVEI   DAT,WRTOFS              ;I SUBR
1579:         PUSHJ   P,NEWAIT
1580:         POP     P,USETP(DDB)            ;RESTORE USET
1581:         TLZ     IOS,RENAMB              ;UNLOCK FILE
1582:         JRST    DEPOPJ
1583: 
1584: ;***** I-SUBR FOR SMEARING OUT DOFFST CHANGE *****
1585: WRTOFS: MOVE    TAC,FILLOC(DDB)         ;HERE IS WHERE WE START
1586:         PUSHJ   P,NEWFIL                ;INITIALIZE FILE
1587: WRTOF1: PUSHJ   P,GGRETI                ;GET RETRIEVAL IN
1588:         MOVE    TAC1,SRCTMP(DDB)        ;GET NEW OFFSET
1589:         MOVEM   TAC1,DOFFST(DDB)        ;SET INTO RETRIEVAL
1590:         PUSHJ   P,SPREAD                ;SPREAD RET. OVER GROUP
1591:         SKIPN   DNXTGP(DDB)             ;ANOTHER TO GO?
1592:         POPJ    P,
1593:         MOVEI   TAC,RCPGRP              ;INC USET TO NEXT GROUP
1594:         ADDM    TAC,USETP(DDB)
1595:         JRST    WRTOF1                  ;AND LOOP
1596: ;CALL:
1597: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1598: ;                       20
1599: ;                       RECORD OFFSET STORED HERE
1600: ;                       ACTUAL FILE LENGTH      ]
1601: ;       ERROR RETURN
1602: ;       SUCCESS RETURN
1603: RDOFF:  MOVE    TAC,DOFFST(DDB)
1604:         ADDI    TAC,1
1605:         XCTR    XW,[MOVEM TAC,1(UUO)]   ;REPORT STARTING RECORD #
1606:         MOVE    TAC,FILLNG(DDB)
1607:         XCTR    XW,[MOVEM TAC,2(UUO)]   ;REPORT ACTUAL FILE LENGTH
1608:         POPJ    P,
    DSKSER page# 0020 next  prev
1610: ;       DIAGL, DIAGW
1611: ;CALL:
1612: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1613: ;                       12
1614: ;                       ADDRESS TO PUT DIAGNOSTIC (MUST BE 200 WORDS)
1615: ;                       FLOPPY DISK ADDRESS     ]
1616: ;       IO ERROR RETURN
1617: ;       SUCCESS RETURN
1618: 
1619: DIAGL:  XCTR    XR,[MOVE TAC1,1(UUO)]           ;PICK UP ADDRESS OF 200 WORD BUFFER
1620:         PUSHJ   P,RELOCA
1621:         JRST    UADRER
1622:         JUMPL   TAC1,UADRER                     ;MUST HAVE WRITE PERMISSION
1623:         HRRZM   TAC1,TFRIOW(DDB)
1624:         XCTR    XR,[HRRZ TAC1,1(UUO)]
1625:         ADDI    TAC1,177
1626:         PUSHJ   P,RELOCB
1627:         JRST    UADRER
1628:         XCTR    XR,[MOVE TAC,2(UUO)]            ;PICK UP FLOPPY DISK ADDRESS
1629:         CAILE   TAC,377                         ;MUST BE ONE BYTE
1630:         JRST    UADRER
1631:         DPB     TAC,[POINT 8,TFRSEC(DDB),7]     ;PUT IN PLACE FOR PICK UP BY CHANNEL
1632:         MOVSI   TAC,IOPCHN                      ;KLUDGE TO INDICATE READ
1633: LWMERG: MOVEM   TAC,TFRCTL(DDB)
1634:         PUSHJ   P,GOSET                         ;LOCK HIM IN FOR THIS
1635:         MOVEI   DAT,LWSTRT
1636:         PUSHJ   P,QEWAIT                        ;START OP AND WAIT FOR IT
1637:         JRST    DEPOPJ                          ;CHECK ERRORS AND UNLOCK
1638: 
1639: ;CALL:
1640: ;       MTAPE CHN,[     SIXBIT/GODMOD/
1641: ;                       13
1642: ;                       ADDRESS TO GET DIAGNOSTIC FROM (MUST BE 200 WORDS)
1643: ;                       ADDRESS TO PUT ERROR CODE (4 WORDS)     ]
1644: ;       IO ERROR RETURN
1645: ;       SUCCESS RETURN
1646: 
1647: DIAGW:  PUSHJ   P,DGODZ
1648:         XCTR    XR,[MOVE TAC1,1(UUO)]
1649:         PUSHJ   P,RELOCA
1650:         JRST    UADRER
1651:         HRRZM   TAC1,TFRSEC(DDB)
1652:         XCTR    XR,[MOVE TAC1,1(UUO)]
1653:         ADDI    TAC,177
1654:         PUSHJ   P,RELOCB
1655:         JRST    UADRER
1656:         XCTR    XR,[MOVE TAC1,2(UUO)]
1657:         PUSHJ   P,RELOCA
1658:         JRST    UADRER
1659:         JUMPL   TAC1,UADRER             ;LOSE IF WRITE PROTECTED
1660:         HRRZM   TAC1,TFRIOW(DDB)
1661:         XCTR    XR,[MOVE TAC1,2(UUO)]
1662:         ADDI    TAC,3
1663:         PUSHJ   P,RELOCB
1664:         JRST    UADRER
1665:         MOVSI   TAC,DWRITE!IOPCHN
1666:         JRST    LWMERG
1667: 
1668: ;DIAGNOSTIC I-SUBR ************
1669: LWSTRT: MOVEM   DDB,DXB
1670:         MOVEM   J,DXJ
1671:         MOVEM   P,DXP
1672:         TRZ     IOS,IODERR!IODTER
1673:         MOVE    TAC,TFRSEC(DDB)
1674:         MOVEM   TAC,DXS
1675:         MOVE    TAC,TFRIOW(DDB)
1676:         MOVEM   TAC,DXW
1677:         HLRZ    TAC,TFRCTL(DDB)
1678:         MOVEM   TAC,DXC
1679:         JRST    WLDIAG                  ;DISPATCH TO DEVICE DEPENDENT SUBR
    DSKSER page# 0021 next  prev
1681: ;       GETRTR
1682: ;CALL:  
1683: ;       MTAPE   CHN,['GODMOD'
1684: ;                       14
1685: ;                    IOWD WC,MA]        ;WC≤40
1686: ;       <ERROR - NO LOOKUP OR ENTER>
1687: ;PLACE UP TO 40 WORDS OF FILE RETRIEVAL AT USER'S ADR.
1688: ;RETRIEVAL IS COPIED FROM THE DDB FOR THIS CHANNEL.
1689: ;USER MUST HAVE A FILE LOOKED UP SUCESSFULLY ALREADY.
1690: 
1691: ;REG THIS PAGE
1692: 
1693: GETRTR: TLNN    IOS,READB+WRITEB+ALTERB ;LOOKUP OR ENTER DONE?
1694:         POPJ    P,                      ;NO
1695:         XCTR    XR,[HRRZ TAC1,1(UUO)]   ;GET HIS ADDRESS
1696:         XCTR    XR,[HLRO TAC,1(UUO)]    ;AND THE WC
1697:         CAMGE   TAC,[-40]
1698:         JRST    UADRER
1699:         SUB     TAC1,TAC                ;COMPUTE LAST ADDRESS OF TRANSFER
1700:         PUSHJ   P,RELOCA                ;
1701:         JRST    UADRER
1702:         JUMPL   TAC1,UADRER
1703:         XCTR    XR,[HRRZ TAC1,1(UUO)]   ;GET THE ADDRESS HE SAID
1704:         ADDI    TAC1,1                  ;MAKE IT HONEST
1705:         PUSHJ   P,RELOCB
1706:         JRST    UADRER
1707:         JUMPL   TAC1,UADRER
1708:         HRLI    TAC1,DDNAM(DDB)         ;GET INFO FROM HERE
1709:         XCTR    XR,[HLRO TAC,1(UUO)]    ;GET -WC
1710:         MOVN    TAC,TAC                 ;+WC
1711:         MOVE    AC2,TAC                 ;REMEMBER THE WC
1712:         ADDI    TAC,(TAC1)              ;ADD BEGINNING ADDRESS
1713:         MOVEI   AC1,(TAC1)              ;SAVE USER'S ADDRESS
1714:         BLT     TAC1,-1(TAC)            ;MOVE DATA
1715:         MOVE    TAC,JBTPRV(J)           ;GET THIS GUY'S PRIVILEGES
1716:         CAILE   AC2,DQINFO-DDNAM        ;DID THIS USER READ SPECIAL STUFF?
1717:         TLNE    TAC,INFPRV              ;IS HE ALLOWED TO SEE ALL RETRIEVAL?
1718:         JRST    CPOPJ1                  ;PRIVILEGED OR DIDN'T ATTEMPT TO READ DQINFO
1719:         SETZM   DQINFO-DDNAM(AC1)       ;ZERO DQINFO
1720:         MOVSI   TAC1,DQINFO-DDNAM(AC1)  ;SOURCE
1721:         HRRI    TAC1,DQINFO-DDNAM+1(AC1)        ;DESTINATION OF BLT
1722:         CAILE   AC2,DQINFO+DQLEN-DDNAM  ;DOES WC EXCEED SPECIAL AREA?
1723:         MOVEI   AC2,DQINFO+DQLEN-DDNAM  ;YES. MAKE IT SMALLER.
1724:         ADDI    AC2,-1(AC1)             ;ADD TO MAKE LAST ADDRESS TO ZERO
1725:         CAIL    AC2,(TAC1)              ;IS THIS A NULL BLT?
1726:         BLT     TAC1,(AC2)              ;REAL BLT TO ZERO CORE.
1727:         JRST    CPOPJ1                  ;RETURN.
    DSKSER page# 0022 next  prev
1729: ;       INFCOM, ADDBLK, FILEUP, TKSFRE, DSKRES
1730: ;CALL:  
1731: ;       MTAPE   CHN,['GODMOD'
1732: ;                       15
1733: ;                       0-4             ;WHICH WORD TO COMPARE WITH
1734: ;                      DATA  ]          ;DATA TO BE COMPARED
1735: ;       <NO LOOKUP OR ENTER OR COMPARE NOT EQUAL>
1736: ;THIS IS A UUO TO COMPARE A WORD FROM THE USER WITH ONE FROM
1737: ;THE SPECIAL 5 WORD RETRIEVAL BLOCK IN A FILE
1738: 
1739: INFCOM: TLNN    IOS,READB!WRITEB!ALTERB
1740:         POPJ    P,
1741:         XCTR    XR,[MOVE TAC,1(UUO)]    ;PICK UP INDEX INTO 5 WORD RETRIEVAL BLOCK
1742:         JUMPL   TAC,UADRER              ;CHECK IT
1743:         CAIL    TAC,DQLEN
1744:         JRST    UADRER
1745:         ADDI    TAC,DQINFO(DDB)         ;CALC ADDR OF WORD
1746:         MOVE    TAC,(TAC)               ;PICK IT UP
1747:         XCTR    XR,[CAMN TAC,2(UUO)]    ;EQUAL TO LOSERS WORD?
1748:         AOS     (P)                     ;YES, SKIP
1749:         POPJ    P,
1750: 
1751: ;CALL:
1752: ;       MTAPE   CHN,['GODMOD'
1753: ;                       16
1754: ;                    RECORD # (REAL, NOT OFFSET)]
1755: ;       <NO LOOKUP OR ENTER OR NON-EX BLOCK>
1756: ;THIS UUO ALLOWS THE USER(LOSER) TO INCLUDE AN
1757: ;EXISTING BLOCK IN HIS WORD COUNT!
1758: 
1759: ADDBLK: TLNN    IOS,ALTERB!WRITEB!READB ;FILE OPEN SOMEHOW?
1760:         POPJ    P,
1761:         XCTR    XR,[SKIPG TAC,1(UUO)]   ;PICK UP LOSERS REC. NO.
1762:         POPJ    P,                      ;AVOID CONFUSION
1763:         PUSH    P,USETP(DDB)            ;SAVE OLD USET POINTER IN CASE HE LOSES
1764:         ADD     TAC,DOFFST(DDB)         ;DO OFFSET
1765:         MOVEM   TAC,USETP(DDB)
1766:         PUSHJ   P,GOSET                 ;MAKE US UNSTOPPABLE IN CASE BAD POINTER
1767:         PUSHJ   P,GETRET                ;GET RETRIEVAL FOR RECORD
1768:         JRST    ADDLOS                  ;NO SUCH GROUP
1769:         PUSHJ   P,LR2BLK                ;THE GROUP EXISTS, DOES THE BLOCK?
1770:         JUMPE   TAC,ADDLOS              ;0 MEANS NO SUCH BLOCK
1771:         SUB     P,[1,,1]                ;BLOCK EXISTS, LOSE OLD USETP
1772:         MOVE    TAC,USETP(DDB)          ;NOW INCLUDE THIS BLOCK IN WC
1773:         LSH     TAC,RECWSH              ;MAKE IT WORDS
1774:         CAMG    TAC,FILLNG(DDB)
1775:         JRST    DPOPJ1                  ;ALREADY IN WC
1776:         MOVEM   TAC,FILLNG(DDB)         ;UPDATE FILE LENGTH
1777:         TLNE    IOS,ALTERB!WRITEB       ;WRITING?
1778:         TLO     IOS,HDRDIF              ;YES, MAKE SURE IT GETS WRITTEN OUT LATER
1779:         TDZ     IOS,[IOEND,,IODEND]     ;CAN'T BE EOF ANY MORE
1780:         JRST    DPOPJ1
1781: 
1782: ADDLOS: POP     P,USETP(DDB)            ;NO SUCH RECORD, GET BACK OLD ONE
1783:         JRST    DPOPJ                   ;AND GIVE ERROR RETURN
1784: 
1785: ;CALL
1786: ;       MTAPE   CHN,['GODMOD'
1787: ;                       17   ]
1788: FILEUP: TLNE    IOS,ALTERB!WRITEB       ;FILE OPEN?
1789:         TLNN    IOS,PNTDIF!HDRDIF       ;YES, ANYTHING TO DO?
1790:         POPJ    P,                      ;NO, NO-OP
1791:         MOVEI   DAT,DCLOI
1792:         JRST    NENTER                  ;ENTER REQUEST AND RETURN TO USER
1793: 
1794: ;MTAPE TO FIND OUT NUMBER OF FREE TRACKS ON A STRUCTURE
1795: ;CALL
1796: ;       MTAPE   CHN,['GODMOD'
1797: ;                       22
1798: ;                       ADDRESS TO STORE RESULT]
1799: 
1800: TKSFRE: LDB TAC1,PUNIT                  ;FIND OUT THE ANSWER
1801:         PUSHJ P,DSKRES                  ;RESULT IN TAC
1802:         XCTR XEW,[MOVEM TAC,@1(UUO)]    ;RETURN RESULT TO THE USER
1803:         POPJ P,
1804: 
1805: DSKRES:MOVE TAC,LSTBTB(TAC1)                   ;CALC RESOURCES FOR UNIT IN TAC1
1806:         SKIPN TAC1,SATADR(TAC1)                 ;(CLOBBERS TAC1!)
1807:         JRST DKRES1                             ;NO SAT, NO TRACKS!
1808:         MOVE TAC1,DSKUSE(TAC1)                  ;THIS IS THE NUMBER IN USE
1809:         SUBI TAC,=200(TAC1)                     ;MINUS MAGIC BUFFER
1810:         JUMPGE TAC,CPOPJ
1811: DKRES1: MOVEI TAC,0
1812:         POPJ P,
1813: 
1814: ;MTAPE TO FIND OUT SATID OF A STRUCTURE
1815: ;CALL
1816: ;       MTAPE   CHN,['GODMOD'
1817: ;                       23
1818: ;                       ADDRESS TO STORE RESULT]
1819: 
1820: VOLID:  LDB TAC1,PUNIT                  ;TELL USER THE SATID
1821:         SKIPE TAC,SATADR(TAC1)
1822:         MOVE TAC,SATID(TAC)             ;IT SAYS HERE THERE HAS TO BE A SAT
1823:         XCTR XEW,[MOVEM TAC,@1(UUO)]
1824:         POPJ P,
    DSKSER page# 0023 next  prev
1826: ;LOOKUP
1827: 
1828: DLOOK:  TLZ     IOS,IO!READB
1829:         TLNE    IOS,WRITEB
1830:         JRST    EXFIL                           ;THIS DDB IS ALREADY WRITING
1831:         SETZM   FILNAM(DDB)                     ;DISABLE RENAME.
1832:         JSP     AC1,ACCENT
1833:         SKIPN   ACCNAM(DDB)                     ;WAS THE SPECIFIED NAME BLANK?
1834:         JRST    ENOFIL                          ;YES. LOSE.
1835:         PUSHJ   P,GOSET
1836:         PUSHJ   P,SATGET                        ;MAKE SURE SAT TABLE IS IN (FOR UDP)
1837:         JSP     AC1,ACCESS                      ;CHECK WHO'S DIDDLING FILE
1838:         JRST    DLK1                            ;READ ENTRY - BORROW DATA
1839:         JRST    DLK2                            ;WRITE ENTRY
1840:         PUSHJ   P,FILSRC                        ;SEARCH DIRECTORY FOR FILE
1841:         SKIPG   SRCTMP(DDB)
1842:         JRST    ENOFIL                          ;NOT FOUND, LOSE
1843:         MOVE    TAC,SRCEXT(DDB)
1844:         MOVEM   TAC,ACCEXT(DDB)
1845:         MOVE    TAC,SRCPRO(DDB)
1846:         MOVEM   TAC,ACCPRO(DDB)
1847:         JRST    DLK3                            ;GO CHECK PROTECTION.
1848: 
1849: DLK2:   TLNN    TAC1,NTRUFD                     ;WRITING; IS THERE AN OLD FILE?
1850:         JRST    ENOFIL                          ;JUST NEW ONE, REPORT NON EX
1851:         JRST    ACCES1                          ;THERE IS AN OLD ONE, SEEK IT
1852: 
1853: DLK1:   MOVE    TAC1,FILEXT(TAC)                ;READ ENTRY FOUND. - BORROW DATA
1854:         MOVEM   TAC1,SRCEXT(DDB)
1855:         MOVEM   TAC1,ACCEXT(DDB)
1856:         MOVE    TAC1,FILPRO(TAC)                ;STEAL DATA
1857:         MOVEM   TAC1,SRCPRO(DDB)
1858:         MOVEM   TAC1,ACCPRO(DDB)
1859:         SKIPN   TAC1,FILLOC(TAC)
1860:         MOVE    TAC1,SRCLOC(TAC)
1861:         MOVEM   TAC1,SRCLOC(DDB)
1862:         MOVE    TAC1,UFDPRO(TAC)
1863:         MOVEM   TAC1,UFDPRO(DDB)
1864: DLK3:   MOVSI   DAT,200000
1865:         JSP     AC1,UPROTC                      ;CHECK READ ACCESS TO UFD
1866:         MOVSI   DAT,200000                      ;CHECK READ PROTECTION.
1867:         JSP     AC1,PROTEC
1868:         TLO     IOS,READB
1869:         PUSHJ   P,ACCEST                        ;OK, ACCESS ESTABLISHED
1870:         LDB     DAT,PUNIT
1871:         SKIPLE  TAC,SRCLOC(DDB)                 ;REASONABLE ADDRESS?
1872:         CAMLE   TAC,LSTBTB(DAT)                 ;IF NOT,
1873:         JRST    EGARB1                          ;UFD HAS BAD POINTER IN IT.
1874:         MOVEI   DAT,LOOKI
1875:         PUSHJ   P,QEWAIT                        ;UPDATE TIMES, GET LENTGH
1876:         TLNE    IOS,LOSBIG
1877:         JRST    EGARB2                          ;WRONG FILE FOUND AT LOC.
1878: DRPT:   MOVEI   AC1,3(UUO)                      ;END ADDRESS
1879:         TRNE    IOS,DMPBIT                      ;UNLESS DMPBIT SET
1880:         ADDI    AC1,2                           ;THEN 2 LONGER
1881:         HLRZ    TAC,PROG
1882:         CAIL    TAC,(AC1)                       ;ADDRESS IN LOWER?
1883:         JRST    DRPT2                           ;ENDS IN LOWER
1884:         TRNN    UUO,400000                      ;UPPER STARTING ADDRESS?
1885:         JRST    ADRERR                          ;NO
1886:         LDB     TAC1,PSEGN
1887:         JUMPE   TAC1,ADRERR
1888:         MOVE    TAC,JBTSTS(TAC1)
1889:         TLNE    TAC,JWP                         ;WRITE PROTECTED?
1890:         JRST    ADRERR                          ;YES, LOSE
1891:         HLRZ    TAC,JBTADR(TAC1)
1892:         CAIGE   TAC,-400000(AC1)                ;END IN UPPER?
1893:         JRST    ADRERR                          ;NO, LOSE
1894:         HRRZ    TAC,JBTADR(TAC1)
1895:         SUBI    TAC,400000
1896:         JRST    DRPT1
1897: 
1898: DRPT2:  HRRZ    TAC,PROG
1899: DRPT1:  ADDI    TAC,(UUO)                       ;REPORT DATA TO USER
1900:         PUSH    TAC,FILEXT(DDB)
1901:         PUSH    TAC,FILPRO(DDB)
1902:         MOVN    TAC1,DDLNG(DDB)
1903:         TLNE    IOS,ALTERB                      ;ARE WE GETTING INTO ALTER MODE?
1904:         MOVN    TAC1,FILLNG(DDB)                ;YES, USE HONEST FILE LENGTH!
1905:         MOVNM   TAC1,FILLNG(DDB)
1906:         MOVE    AC1,DOFFST(DDB)
1907:         LSH     AC1,RECWSH                      ;MAKE IT WORDS
1908:         ADD     TAC1,AC1                        ;REPORT ADJUSTED SIZE TO USER
1909:         SKIPLE  TAC1
1910:         SETZ    TAC1,                           ;ACCOUNT FOR DOFFST BEING EOF
1911:         MOVSS   TAC1
1912:         PUSH    TAC,TAC1
1913:         MOVE    TAC1,DREFTM(DDB)                ;BEGIN RPH 3-8-73
1914:         MOVEM   TAC1,REFTIM(DDB)                ;UPDATE THIS CRUFT
1915:         TRNE    IOS,DMPBIT
1916:         PUSH    TAC,TAC1
1917:         MOVE    TAC1,DDMPTM(DDB)
1918:         MOVEM   TAC1,DMPTIM(DDB)
1919:         TRNE    IOS,DMPBIT
1920:         PUSH    TAC,TAC1                        ;END RPH
1921: 
1922: DLOK:   PUSHJ   P,DGETL
1923:         MOVE    TAC1,DOFFST(DDB)
1924:         ADDI    TAC1,1                          ;INIT USETP POINTER TO OFFSET
1925:         CAMLE   TAC,TAC1                        ;DOFFST INSIDE FILE?
1926:         MOVE    TAC,TAC1                        ;OK, USE DOFFST
1927:         MOVEM   TAC,USETP(DDB)
1928: 
1929: DPOPJ1: AOS     (P)
1930: DPOPJ:  TLZ     IOS,GOBIT
1931:         MOVEM   IOS,DEVIOS(DDB)
1932:         CONSZ   PI,177B27                       ;ARE WE AT UUO LEVEL?
1933:         POPJ    P,                              ;NO, CAN'T DO ANYTHING HERE!
1934:         PUSH    P,AC3
1935:         MOVE    J,JOB(PID)
1936:         MOVE    AC3,JBTLIN(J)
1937:         CAMN    AC3,[-1]                        ;DETACHED?
1938:         JRST    DPJRA3
1939:         PUSH    P,AC2
1940:         PUSH    P,AC1
1941: 
1942:         MOVSI   AC1,DLYBIT
1943:         MOVSI   AC2,COMBIT
1944:         CONO    PI,SCNOFF                       ;KEEP SCANNER OUT.
1945:         TDNN    AC1,TTYTAB(AC3)                 ;SKIP IF COMMAND DELAYED
1946:         JRST    DPJRSC                          ;NO DELAYED COMMAND
1947:         ANDCAM  AC1,TTYTAB(AC3)                 ;TURN OFF DELAY BIT
1948:         TDNE    AC2,TTYTAB(AC3)                 ;ANOTHER COMMAND ALREADY IN?
1949:         JRST    DPJRSC                          ;YES.
1950:         AOS     COMCNT                          ;COUNT ANOTHER TTY NEED SCANNING
1951:         IORM    AC2,TTYTAB(AC3)                 ;TURN ON COMMAND BIT
1952: IFN FTTTYBUG,<
1953:         PUSHJ   P,COMBCK
1954:         PUSHJ   P,CNTCOM                        ;MAKE SURE ALL IS WELL
1955: >
1956:         CONO    PI,SCNON
1957: 
1958:         PUSHJ   P,WSCHED
1959: DPJRST: POP     P,AC1
1960:         POP     P,AC2
1961: DPJRA3: POP     P,AC3
1962:         POPJ    P,
1963: 
1964: DPJRSC: CONO    PI,SCNON
1965:         JRST    DPJRST
1966: 
1967: GOSET:  TLO     IOS,GOBIT
1968: DSIOS:  MOVEM   IOS,DEVIOS(DDB)
1969:         POPJ    P,
1970: 
1971: ;*** INTERRUPT SUBR ***
1972: 
1973: LOOKI:  MOVE    TAC,SRCLOC(DDB)                 ;GET RTVL INTO DDB
1974:         MOVEM   TAC,FILLOC(DDB)
1975:         PUSHJ   P,NEWFIL
1976:         PUSHJ   P,GETBLK
1977:         PUSHJ   P,AUDCHK
1978:         TRNE    IOS,DMPBIT                      ;MAKE THIS TRNE IF REFTIM REQUIRED
1979:         POPJ    P,
1980:         MOVE    TAC1,THSDAT                     ;USE DATE ONLY FOR REFERENCE TIME
1981:         CAMG    TAC1,DREFTM(DDB)                ;DON'T UPDATE MORE THAN ONCE A DAY
1982:         POPJ    P,
1983:         SKIPN   TTYLOK                          ;IN MAINTMODE, DON'T WRITE 
1984:         SKIPE   MAINTM
1985:         POPJ    P,
1986:         MOVEM   TAC1,REFTIM(DDB)
1987:         MOVEM   TAC1,DREFTM(DDB)
1988:         MOVEM   TAC1,DREFTM+SYSRTV
1989:         MOVE    TAC,[XWD -40,SYSBUF]
1990:         MOVEM   TAC,TFRIOW(DDB)                 ;DON'T REWRITE WHOLE BLK.
1991:         LDB     TAC1,PUNIT                      ;UDP?
1992:         JUMPE   TAC1,RERITE                     ;NO.
1993:         TRNE    IOS,IOIMPM!IODERR
1994:         POPJ    P,                              ;ERRORS ALREADY. DON'T REWRITE
1995:         PUSHJ   P,RERITE
1996:         TDZ     IOS,[LOSBIG,,IOIMPM!IODERR]     ;DON'T REPORT WRITE LOCK.
1997:         POPJ    P,
    DSKSER page# 0024 next  prev
1999: ;ENTER
2000: 
2001: DENTER: JSP     AC1,ACCENT
2002:         SKIPN   ACCNAM(DDB)
2003:         JRST    ENOFIL                          ;BLANK NAME LOSES
2004:         TLNE    IOS,READB                       ;HAS LOOKUP BEEN DONE?
2005:         JRST    DALTER                          ;YES, IS ALTER
2006:         SETZM   FILNAM(DDB)                     ;DISABLE RENAME.
2007:         SETOM   SRCTMP(DDB)                     ;INITIALIZE FLAG
2008:         JSP     AC1,ACCESS                      ;SEE WHO'S LOOKING
2009:         JRST    DENT0                           ;READ - SAVE DATA (XCTED IN ACCESS)
2010:         JRST    EFWRIT                          ;WRITE - LOSE (XCTED IN ACCESS)
2011:         TLO     IOS,IO!WRITEB!GOBIT
2012:         PUSHJ   P,ACCEST                        ;ACCESS OURS (ACCXXX → FILXXX)
2013:         PUSHJ   P,SATGET                        ;MAKE SURE SAT TABLE IN (FOR UDP)
2014:         SKIPG   SRCTMP(DDB)                     ;WAS SOMEONE READING?
2015:         PUSHJ   P,FILSRC                        ;NO, GET DATA
2016:         TLZ     IOS,WRITEB!NTRUFD               ;TURN OFF IN CASE PROTECTION CHECK
2017:         MOVEM   IOS,DEVIOS(DDB)                 ;   FAILS
2018:         MOVSI   DAT,100000
2019:         JSP     AC1,UPROTC
2020:         SKIPG   SRCTMP(DDB)                     ;THIS NAME IN USE?
2021:         JRST    DENT1                           ;NO FILE FOUND
2022:         MOVSI   DAT,100000                      ;FOUND, CHECK PROTECTION.
2023:         JSP     AC1,PROTEC                      ;WRITE ACCESS REQUIRED.
2024:         LDB     AC1,[POINT 9,FILPRO(DDB),8]
2025:         JUMPN   AC1,DENT1A                      ;JUMP IF USER SPECIFIED PROTECTION
2026:         LDB     AC1,[POINT 9,SRCPRO(DDB),8]     ;USE OLD FILE'S PROT
2027:         DPB     AC1,[POINT 9,FILPRO(DDB),8]     ;...AS NEW FILE'S PROTECTION
2028: DENT1A: TLOA    IOS,NTRUFD!WRITEB               ;INDICATE CHANGE UFD AT CLOSE.
2029: DENT1:  TLOA    IOS,WRITEB                      ;NEW NAME. PUT IN UFD NOW.
2030:         SKIPA   TAC1,SRCEXT(DDB)                ;USE OLD CREATION DATE AS DEFAULT
2031:         MOVE    TAC1,THSDAT                     ;USE CURRENT DATE AS DEFAULT
2032:         LDB     TAC,[POINT 15,ACCEXT(DDB),35]   ;BELIEVE ANY CREATE DATE
2033:         JUMPN   TAC,DENT4                       ;USER TELLS US.
2034:         MOVE    TAC,TAC1
2035:         DPB     TAC,[POINT 15,ACCEXT(DDB),35]
2036: DENT4:  DPB     TAC,[POINT 15,FILEXT(DDB),35]
2037: DENT2:  MOVEM   IOS,DEVIOS(DDB)
2038:         TRNE    IOS,DMPBIT
2039:         JRST    DENT3                           ;DON'T INIT TIME IF DUMPER
2040:         SETZM   DDMPTM(DDB)                     ;NEW FILE NEVER DUMPED.
2041:         SETZM   DMPTIM(DDB)
2042:         MOVE    TAC1,THSDAT                     ;REFERENCE DATE
2043:         MOVEM   TAC1,REFTIM(DDB)
2044:         MOVEM   TAC1,DREFTM(DDB)
2045:         PUSHJ   P,DSKTM1                        ;GET DATE AND TIME LAST WRITTEN
2046:         DPB     TAC,[POINT 3,ACCEXT(DDB),20]    ;STORE EXTRA BITS
2047:         DPB     TAC,[POINT 3,FILEXT(DDB),20]
2048:         MOVSI   TAC,777000                      ;USE SPECIFIED PROTECTION
2049:         AND     TAC,FILPRO(DDB)                 ;GET PROTECTION THUS FAR
2050:         JUMPN   TAC,DENT2A                      ;JUMP IF THERE'S NON-ZERO ALREADY
2051:         TLNE    IOS,NTRUFD                      ;SKIP IF NEW FILE.
2052:         JRST    DENT2A                          ;REPLACING OLD FILE - KEEP 0 PROT
2053: ;HERE WE USE UFD'S DEFAULT PROTECTION WORD FOR PROTECTION OF THIS NEW FILE
2054:         MOVEI   TAC,777000
2055:         AND     TAC,UFDPR1(DDB)                 ;DEFAULT PROTECTION VALUE FROM UFD
2056:         MOVSI   TAC,(TAC)
2057: DENT2A: OR      TAC1,TAC
2058:         DPB     IOS,[POINT 4,TAC1,12]           ;DATA MODE
2059:         MOVEM   TAC1,FILPRO(DDB)
2060:         MOVEM   TAC1,ACCPRO(DDB)
2061:         MOVSI   IOS,HDRDIF
2062:         IORB    IOS,DEVIOS(DDB)                 ;MAKE SURE DATE GOES OUT EVENTUALLY
2063: DENT3:  TLNE    IOS,ALTERB
2064:         JRST    ENTREN                          ;PUT OUT DATE IF ALTER MODE
2065:         LDB     TAC,PUNIT
2066:         JUMPN   TAC,DENT3A
2067:         MOVE    TAC,DSKUSE+SATTAB               ;SEE IF ANY SPACE LEFT
2068:         CAILE   TAC,LSTBIT-=200                 ;SOFT STOP WITH 200K DISK LEFT.
2069:         JRST    ENTFUL                          ;GIVE NO ROOM MESSAGE. ERROR RETURN
2070: DENT3A: PUSHJ   P,ASNBLK                        ;GET SPACE FOR NEW FILE
2071:         MOVEM   TAC,FILLOC(DDB)
2072:         MOVE    TAC,DDLOC(DDB)                  ;UFD LOCN FOR DIRINS
2073:         MOVEM   TAC,SRCLOC(DDB)
2074:         TLNN    IOS,NTRUFD
2075:         PUSHJ   P,DIRINS                        ;NEW FILE TO UFD NOW.
2076:         SETZM   FILLNG(DDB)
2077:         SETZM   DQINFO(DDB)                     ;INITIALIZE MAGIC FILE INFO
2078:         SETZM   DQINFO+1(DDB)
2079:         HLRZ    TAC,FILEXT(DDB)
2080:         CAIE    TAC,UFDEXT
2081:         JRST    NENUFD                          ;NOT ENTERING A UFD
2082:         MOVE    TAC,FILPPN(DDB)
2083:         CAME    TAC,SYSPPN
2084:         JRST    NENUFD
2085:         SETZM   DQINFO+2(DDB)                   ;CLEAR WORDS WHEN ENTERING A UFD
2086:         SETZM   DQINFO+3(DDB)
2087:         JRST    WENUFD
2088: 
2089: NENUFD: MOVE    TAC,JOBNAM(J)                   ;UPDATE PPN AND JOB OF WRITER
2090:         MOVEM   TAC,DQINFO+2(DDB)
2091:         MOVE    TAC,PRJPRG(J)
2092:         MOVEM   TAC,DQINFO+3(DDB)
2093: WENUFD: SETZM   DOFFST(DDB)                     ;INIT OFFSET
2094:         PUSHJ   P,AUDINF
2095:         MOVE    TAC,FILLOC(DDB)
2096:         PUSHJ   P,NEWFI1
2097:         PUSHJ   P,ASNGR1                        ;SET UP RTVL
2098:         MOVEI   DAT,SPREAD
2099:         TLNN    IOS,NTRUFD                      ;IF NEW FILE,
2100:         PUSHJ   P,QEWAIT                        ;PUT RTVL OUT.
2101:         LDB     TAC,PUNIT
2102:         TRNE    IOS,IODERR!IOIMPM               ;UDP IN WRITE LOCK?
2103:         JUMPN   TAC,SATGLZ                      ;REPORT DATA TO USER.
2104:         JRST    DRPT
2105: 
2106: DENT0:  MOVE    TAC1,FILPRO(TAC)                ;READER FOUND, SAVE PROTECTION.
2107:         MOVEM   TAC1,SRCPRO(DDB)
2108:         MOVE    TAC1,FILEXT(TAC)
2109:         HRRM    TAC1,SRCEXT(DDB)
2110:         MOVE    TAC1,UFDPRO(TAC)
2111:         MOVEM   TAC1,UFDPRO(DDB)
2112:         MOVEI   TAC1,1                          ;SET FLAG: ITEM FOUND
2113:         MOVEM   TAC1,SRCTMP(DDB)
2114:         JRST    ACCES1                          ;KEEP LOOKING FOR WRITERS
2115: 
2116: ENTREN: PUSHJ   P,ALTREN                        ;WRITE DATE INTO UFD
2117:         JFCL                                    ;CAN'T GET ERROR RETURN???
2118:         JRST    DRPT                            ;RETURN LOOKUP INFO
2119: 
2120: DALTER: TLOE    IOS,ALTERB
2121:         JRST    EFWRIT                          ;ALREADY ALTERING
2122:         MOVE    TAC,FILNAM(DDB)                 ;SAME FILE?
2123:         CAME    TAC,ACCNAM(DDB)
2124:         JRST    EANAME
2125:         HLLZ    TAC,FILEXT(DDB)
2126:         HLLZ    TAC1,ACCEXT(DDB)
2127:         CAME    TAC,TAC1
2128:         JRST    EANAME
2129:         MOVE    AC2,FILPPN(DDB)
2130:         CAME    AC2,ACCPPN(DDB)
2131:         JRST    EANAME
2132:         MOVSI   DAT,100000
2133:         JSP     AC1,UPROTC                      ;SEE IF UFD ALLOWS THIS ACCESS
2134:         MOVSI   DAT,100000                      ;NEEDS WRITE ACCESS
2135:         MOVE    AC3,FILPRO(DDB)
2136:         JSP     AC1,PROTEK
2137:         JSP     AC1,ACCESS                      ;IS ANYONE USING FILE?
2138:         JRST    EFWRIT                          ;IF SO, LOSE
2139:         JRST    EFWRIT
2140:         JRST    DENT2                           ;STORE IOS & SKIP RETURN.
    DSKSER page# 0025 next  prev
2142: ;RENAME
2143: 
2144: DRENAM: TDNE    IOS,[XWD DEVSBB,IOACT]
2145:         PUSHJ   P,WAIT1                         ;FINISH CURRENT BUSINESS
2146:         SKIPN   FILNAM(DDB)
2147:         JRST    EXFIL                           ;LOSE IF NO ACCESSED FILE.
2148:         TLNE    IOS,NTRUFD!DELETB               ;IF FILE TO BE DELETED,
2149:                                                 ;OR OVERWRITING AND NO CLOSE
2150:         JRST    ENOFIL                          ;CAN'T RENAME.
2151:         TLNN    IOS,READB                       ;IF READING, TEST UNIQUE ACCESS.
2152:         JRST    DRE0                            ;OTHERWISE, ALREADY UNIQUE.
2153:         XCTR    XR,[MOVE AC2,(UUO)]             ;NEW FILE NAME
2154:         JSP     AC1,ACCESS                      ;IS ANYONE ELSE RENAMING FILE?
2155:         JUMPN   AC2,EFWRIT                      ;LOSE UNLESS DELETING
2156:         JFCL                                    ;CAN'T AFFECT FOREIGN WRITER
2157: DRE0:   PUSHJ   P,FILEUP                        ;FORCE RETRIEVAL SO WE DON'T MUNG IT
2158:         PUSHJ   P,GOSET
2159:         TRNE    IOS,DMPBIT
2160:         JRST    DRE0A                           ;DON'T INIT TIME IF DUMPER
2161:         MOVE    TAC1,THSDAT                     ;GET REFERENCE DATE
2162:         MOVEM   TAC1,REFTIM(DDB)                ;UPDATE REFTIM FOR RANDOM LOSER
2163: DRE0A:  JSP     AC1,ACCENT                      ;JUST US. PICK UP UUO ARGS.
2164:         SKIPN   TAC,ACCNAM(DDB)
2165:         JRST    DRNMC                           ;DELETING, CHECK WRITE PROT
2166:         MOVE    TAC,ACCPRO(DDB)
2167:         XOR     TAC,FILPRO(DDB)                 ;PROTECTION CHANGE?
2168:         TLNN    TAC,777000
2169:         JRST    DRE1                            ;NO CHANGE
2170:         MOVE    AC2,FILPPN(DDB)
2171:         CAME    AC2,SYSPPN
2172:         JRST    DRE0B                           ;NOT ACCESS TO A UFD
2173:         MOVE    AC2,FILNAM(DDB)                 ;UFD ACCESS.  TO MFD?
2174:         CAMN    AC2,SYSPPN
2175:         JRST    EPROT                           ;CHANGE PROT OF MFD NOT ALLOWED
2176:         MOVE    AC1,JBTPRV(J)
2177:         TLNN    AC1,PROPRV                      ;PRIVILEGED?
2178:         CAMN    AC2,PRJPRG(J)                   ;NO. BUT ACCESS TO OWN UFD OK
2179:         JRST    DRE1
2180:         JRST    EPROT
2181: 
2182: DRE0B:  MOVSI   DAT,400000
2183:         JSP     AC1,UPROTK                      ;LEGAL TO CHANGE IN THIS UFD?
2184:         MOVSI   DAT,400000
2185:         MOVE    AC3,FILPRO(DDB)
2186:         JSP     AC1,PROTEK                      ;LEGAL TO CHANGE THIS FILE?
2187: 
2188: DRE1:   MOVE    TAC,FILNAM(DDB)
2189:         CAME    TAC,ACCNAM(DDB)
2190:         JRST    DRNMC                           ;NAME CHANGE.
2191:         HLLZ    TAC1,FILEXT(DDB)
2192:         XOR     TAC1,ACCEXT(DDB)
2193:         TLNE    TAC1,777777                     ;EXT CHANGE?
2194:         JRST    DRNMC
2195:         MOVE    TAC1,FILPPN(DDB)
2196:         CAME    TAC1,ACCPPN(DDB)                ;NEW PROJ.-PROG?
2197:         JRST    DRNMC                           ;YES, NEW PPN
2198: ALTREN: PUSHJ   P,FILSRC                        ;LITTLE OR NO CHANGE. GET RTVL IN.
2199:         JRST    DRE2
2200: 
2201: DRNMC:  MOVSI   DAT,100000                      ;NAME CHANGE REQUIRES WRITE ACCESS
2202:         MOVE    AC2,FILPPN(DDB)
2203:         JSP     AC1,UPROTK                      ;UFD ALLOWS WRITE ACCESS?
2204:         MOVSI   DAT,100000
2205:         MOVE    AC3,FILPRO(DDB)
2206:         JSP     AC1,PROTEK                      ;FILE ALLOWS WRITE ACCESS?
2207:         JUMPE   TAC,DRDEL                       ;0 = DELETE.
2208:         JSP     AC1,ACCESS                      ;NEW NAME; SEE IF IN USE.
2209:         JRST    EDNAME
2210:         JRST    EDNAME                          ;YES, LOSE.
2211:         TLO     IOS,RENAMB                      ;ESTABLISH UNIQUE ACCESS NOW!
2212:         MOVEM   IOS,DEVIOS(DDB)
2213:         MOVE    AC3,UFDPRO(DDB)                 ;THIS GETS CLOBBERED BY FILSRC
2214:         MOVEM   AC3,UFDPR1(DDB)
2215:         PUSHJ   P,FILSRC                        ;SEE IF IN DIRECTORY.
2216:         TLZ     IOS,RENAMB                      ;IN CASE OF ACCIDENT, RELEASE ACCESS
2217:         MOVE    AC3,UFDPR1(DDB)                 ;GET BACK PROTECTION OF SOURCE UFD
2218:         EXCH    AC3,UFDPRO(DDB)                 ;DESTINATION UFD PROTECTION IN AC3
2219:         SKIPLE  TAC,SRCTMP(DDB)                 ;DOES FILE NAME EXIST?
2220:         JRST    EDNAME                          ;FILE NAME IS IN USE. (STORES IOS)
2221:         TRNN    IOS,DMPBIT
2222:         SETZM   DMPTIM(DDB)                     ;CLEAR DUMP DATE, UNLESS DUMPER
2223: 
2224: DRE2:   TLO     IOS,RENAMB                      ;KEEP HACKERS OUT WHILE...
2225:         MOVEM   IOS,DEVIOS(DDB)                 ;CHANGING THINGS.
2226:         MOVE    TAC,DDLOC(DDB)                  ;POINTS TO DESTINATION UFD ALWAYS
2227:         MOVEM   TAC,SRCLOC(DDB)                 ;TELL DIRSRC WHERE TO LOOK.
2228:         MOVE    TAC,ACCPPN(DDB)                 ;COMPARE PPN
2229:         CAMN    TAC,FILPPN(DDB)
2230:         JRST    DREC1                           ;SAME PPN, CHANGE 1 UFD
2231:         MOVSI   DAT,100000                      ;REQUIRES WRITE ACCESS TO OTHER UFD
2232:         MOVE    AC2,ACCPPN(DDB)                 ;GET PPN OF DESTINATION. AC3 SETUP
2233:         JSP     AC1,PROT0                       ;SEE IF ACCESS ALLOWED.
2234:         MOVE    TAC,FILEXT(DDB)                 ;COPY CREATION DATE FROM RETRIEVAL
2235:         DPB     TAC,[POINT 15,ACCEXT(DDB),35]   ;INTO USERS VARIABLES
2236:                                                 ;(WILL BE COPIED BACK LATER)
2237:         TRNE    TAC,700000                      ;CHECK THIS PART OF DATE
2238:         JRST    DRE3                            ;USER IS SPECIFYING DATE & TIME
2239:         MOVE    TAC,ACCPRO(DDB)
2240:         TDNE    TAC,[777,,777777]               ;ANY DATE AND TIME?
2241:         JRST    DRE3                            ;YES, USE IT
2242:         MOVE    TAC,FILPRO(DDB)                 ;NO, USE THOSE FROM RETRIEVAL
2243:         TLZ     TAC,777000                      ;CLEAR PROT.
2244:         IORM    TAC,ACCPRO(DDB)
2245:         LDB     TAC,[POINT 3,FILEXT(DDB),20]
2246:         DPB     TAC,[POINT 3,ACCEXT(DDB),20]
2247: DRE3:   PUSHJ   P,DIRINS                        ;CHANGE 2 UFD'S. INSERT NEW
2248:         MOVEI   TEM,FILNAM(DDB)
2249:         PUSHJ   P,SRCH1                         ;FIND OLD UFD
2250:         SKIPA   DAT,[DR2INT]                    ;AND REMOVE OUR ENTRY
2251: DREC1:  MOVEI   DAT,DRINT                       ;CHANGE 1 UFD ONLY
2252:         MOVE    AC1,FILLNG(DDB)
2253:         CAILE   AC1,=50*2000
2254:         JRST    DRE8
2255:         PUSHJ   P,QEWAIT
2256:         JRST    DRE7
2257: 
2258: DRE8:   PUSHJ   P,NEWAIT
2259: DRE7:   TLZA    IOS,RENAMB                      ;SEE US SAVE A WORD OF CODE.
2260: DRDEL:  PUSHJ   P,DCLSO9                        ;ARRANGE TO DELETE FILE.
2261:         LDB     TAC,PUNIT
2262:         TRNE    IOS,IODERR!IOIMPM               ;WRITE ERROR?
2263:         JUMPN   TAC,SATGLZ                      ;LOSE. WRITE LOCKED UDP
2264:         JRST    DPOPJ1                          ;RETURN TO USER
2265: 
2266: ;***INTERRUPT LEVEL SUBRS***
2267: 
2268: DRAUFX: AOS     DRAUFO
2269:         POPJ    P,
2270: 
2271: DRAUFD: SKIPN   TAC,FILNAM(DDB)                 ;FIND ENTRY FOR OLD NAME
2272:         JRST    DRAUFX                          ;NULL NAME? RETURN NO FILE FOUND.
2273:         MOVEM   TAC,SRCNAM(DDB)                 ;(UFD WAS FOUND BY FILSRC)
2274:         MOVE    TAC,FILEXT(DDB)
2275:         HLLZM   TAC,SRCEXT(DDB)
2276:         PUSHJ   P,DIRSRC                        ;FIND UFD ENTRY
2277:         SKIPG   SRCTMP(DDB)
2278:         JRST    DRAUFX                          ;NO OLD FILE FOUND!
2279:         MOVE    TAC,ACCNAM(DDB)                 ;CHANGE IT
2280:         MOVEM   TAC,SYSDTA+UNAM(TAC1)           ;(ALSO USED FOR DELETE)
2281:         MOVE    TAC,ACCEXT(DDB)
2282:         HLLM    TAC,SYSDTA+UEXT(TAC1)
2283:         MOVE    TAC,SYSDTA+UEXT(TAC1)           ;NOW COPY CREATION DATE BACK
2284:         DPB     TAC,[POINT 15,ACCEXT(DDB),35]   ;RPH/DATE75
2285:         LDB     TEM,[POINT 3,ACCEXT(DDB),20]    ;GET DATE
2286:         MOVE    TAC,ACCPRO(DDB)                 ;AND TIME
2287:         TDNN    TAC,[777,,777777]               ;DID HE SPECIFY ANY?
2288:         JUMPE   TEM,UOLDAT                      ;CHECK IT ALL
2289:         JRST    UNEWDA                          ;USER SPECIFYING DATE AND TIME
2290: 
2291: UOLDAT: LDB     TEM,[POINT 3,FILEXT(DDB),20]    ;COPY 3 EXTRA BITS
2292:         DPB     TEM,[POINT 3,ACCEXT(DDB),20]
2293:         MOVE    TAC,FILPRO(DDB)                 ;NOW REST OF DATE AND TIME
2294:         DPB     TAC,[POINT 23,ACCPRO(DDB),35]
2295:         MOVE    TAC,ACCPRO(DDB)
2296: UNEWDA: DPB     TEM,[POINT 3,SYSDTA+UEXT(TAC1),20]      ;STORE BITS IN UFD ENTRY
2297:         MOVEM   TAC,SYSDTA+UPRO(TAC1)                   ;AND THE REST TOO
2298:         MOVE    TAC,FILLOC(DDB)                         ;NEW FILE LOCATION.
2299:         EXCH    TAC,SYSDTA+UPPN(TAC1)           ;OLD ONE USED BY CLOSE OUTPUT.
2300:         MOVEM   TAC,SRCLOC(DDB)
2301: 
2302: REWRIT: MOVEI   TAC,IOPCHN!DWRITE
2303:         MOVSM   TAC,TFRCTL(DDB)
2304:         PUSHJ   P,TSTART                        ;WRITE IT BACK OUT.
2305:         POPJ    P,
2306: 
2307: DRINT:  PUSHJ   P,DRAUFD
2308: DRINT1: MOVE    TAC,FILEXT(DDB)
2309:         PUSHJ   P,ACCST1                        ;UPDATE NAME.
2310:         HRRM    TAC,FILEXT(DDB)                 ;RESTORE TIME
2311:         MOVE    TAC,FILLOC(DDB)                 ;PREPARE TO SPREAD IT
2312:         PUSHJ   P,NEWFIL
2313: 
2314: DRINL:  PUSHJ   P,GGRETI                        ;WRITE NEW NAME OVER FILE
2315:         TLNN    IOS,ALTERB                      ;ARE WE ENTERING R-A MODE,
2316:         JRST    DRINL2                          ;UPDATE JOB AND PPN OF CULPRIT
2317:         HLRZ    TAC,FILEXT(DDB)                 ;EXCEPT FOR UFDS
2318:         CAIE    TAC,UFDEXT
2319:         JRST    DRINL1
2320:         MOVE    TAC,FILPPN(DDB)
2321:         CAMN    TAC,SYSPPN
2322:         JRST    DRINL2
2323: DRINL1: MOVE    TAC,JOBNAM(J)
2324:         MOVEM   TAC,DQINFO+2(DDB)
2325:         MOVE    TAC,PRJPRG(J)
2326:         MOVEM   TAC,DQINFO+3(DDB)
2327: DRINL2: PUSHJ   P,AUDINF                        ;COPY NEW INFO IN RETRIEVAL AREA
2328:         PUSHJ   P,SPREAD
2329:         SKIPN   DNXTGP(DDB)
2330:         POPJ    P,                              ;END FILE, RETURN
2331:         MOVEI   TAC,RCPGRP
2332:         ADDM    TAC,USETP(DDB)
2333:         JRST    DRINL
2334: 
2335: ; WE GET HERE TO DELETE ENTRY IN OLD UFD
2336: ; PPN CHANGE ONLY
2337: ; ENTRY HAS ALREADY (SUPPOSEDLY) BEEN INSERTED IN NEW UFD
2338: 
2339: DR2INT: PUSHJ   P,DIRSRC                        ;FIND ENTRY IN OLD UFD
2340:         SKIPG   SRCTMP(DDB)                     ;IS IT REALLY THERE?
2341:         JRST    DRAUFX                          ;NO, LOSE LOSE
2342:         SETZM   SYSDTA+UNAM(TAC1)               ;DELETE ENTRY IN UFD
2343:         SETZM   SYSDTA+UEXT(TAC1)
2344:         PUSHJ   P,REWRIT
2345:         JRST    DRINT1                          ;SPREAD RETRIEVAL
    DSKSER page# 0026 next  prev
2347: ;FILE ACCESS CONTROL.
2348: 
2349: ACCENT: MOVE    J,JOB(PID)
2350:         XCTR    XR,[MOVE TAC,UNAM(UUO)]         ;NAME
2351:         MOVEM   TAC,ACCNAM(DDB)
2352:         XCTR    XR,[MOVE TAC,UEXT(UUO)]         ;EXT
2353:         MOVEM   TAC,ACCEXT(DDB)
2354:         XCTR    XR,[MOVE TAC,UPRO(UUO)]         ;PROT
2355:         MOVEM   TAC,ACCPRO(DDB)
2356:         XCTR    XR,[SKIPN TAC,UPPN(UUO)]        ;PPN
2357: IFN FTDSKPPN,<  SKIPE   TAC,DSKPPN(J)           ;PICK UP DISK ALIAS PPN IF ANY
2358:                 CAIA                    >;FTDSKPPN
2359:         MOVE    TAC,PRJPRG(J)                   ;USE USER'S PPN IF BLANK
2360:         TLNE    DDB,SYSDEV                      ;SYS?
2361:         MOVE    TAC,CUSPPN                      ;YES, USE CUSP PPN
2362:         MOVEM   TAC,ACCPPN(DDB)
2363:         TRNN    IOS,DMPBIT
2364:         JRST    (AC1)
2365:         XCTR    XR,[MOVE TAC,4(UUO)]
2366:         MOVEM   TAC,REFTIM(DDB)
2367:         XCTR    XR,[MOVE TAC,5(UUO)]
2368:         MOVEM   TAC,DMPTIM(DDB)
2369:         JRST    (AC1)
2370: 
2371: ACCESS: LDB     TAC,PUNIT
2372:         MOVE    TAC,DKDBML(TAC)         ;FIRST DDB IS DUMMY
2373:         HLLZ    DAT,ACCEXT(DDB)         ;IN CASE RH NOT 0.
2374: ACCES1: HLRZ    TAC,DEVSER(TAC)         ;GET NEXT DDB
2375:         MOVE    TAC1,DEVNAM(TAC)        ;GET DEVICE NAME
2376:         CAME    TAC1,DEVNAM(DDB)        ;IS IT SAME AS US
2377:         JRST    2(AC1)                  ;NO, ALL DONE, RETURN
2378:         CAIN    TAC,(DDB)               ;DON'T LOOK AT OWN DDB
2379:         JRST    ACCES1
2380:         MOVE    TAC1,FILNAM(TAC)        ;COMPARE NAME
2381:         CAME    TAC1,ACCNAM(DDB)
2382:         JRST    ACCES1
2383:         HLLZ    TAC1,FILEXT(TAC)
2384:         CAME    TAC1,DAT
2385:         JRST    ACCES1
2386:         MOVE    TAC1,FILPPN(TAC)
2387:         CAME    TAC1,ACCPPN(DDB)
2388:         JRST    ACCES1
2389:         MOVE    TAC1,DEVIOS(TAC)        ;FOUND ONE, SEE WHAT IT'S DOING
2390:         TLNE    TAC1,DELETB
2391:         JRST    ACCES1                  ;IGNORE IF TO BE DELETED.
2392:         TLNE    TAC1,ALTERB!RENAMB      ;ALTERING?
2393:         JRST    EFWRIT                  ;YES, LOSE
2394:         TLNE    TAC1,READB              ;READING?
2395:         XCT     0(AC1)                  ;YES
2396:         TLNE    TAC1,WRITEB             ;WRITING?
2397:         XCT     1(AC1)                  ;YES
2398:         JRST    ACCES1                  ;OK, LOOK FOR MORE.
2399: 
2400: ACCEST: MOVEM   IOS,DEVIOS(DDB)                 ;ACCESS ESTABLISHED
2401: ACCST1: MOVE    TAC1,ACCNAM(DDB)
2402:         MOVEM   TAC1,FILNAM(DDB)
2403:         MOVE    TAC1,ACCEXT(DDB)
2404:         MOVEM   TAC1,FILEXT(DDB)
2405:         MOVE    TAC1,ACCPRO(DDB)
2406:         MOVEM   TAC1,FILPRO(DDB)
2407:         MOVE    TAC1,ACCPPN(DDB)
2408:         MOVEM   TAC1,FILPPN(DDB)
2409:         POPJ    P,
2410: 
2411: PROTEC: MOVE    AC2,ACCPPN(DDB)
2412:         MOVE    AC3,SRCPRO(DDB)
2413: PROTEK: CAMN    AC2,SYSPPN              ;ACCESS TO A UFD?
2414:         JRST    PROT3                   ;YES.
2415: PROT0:  CAMN    AC2,PRJPRG(J)           ;OWNER ACCESS TO FILE?
2416:         JRST    PROT1                   ;YES.  DO OWNER ACCESS TESTS
2417:         LSH     AC3,3                   ;NOT OWNER. SHIFT TO LOCAL-USER BITS
2418:         MOVE    TAC1,JBTPRV(J)          ;
2419:         TLNN    TAC1,LUPPRV             ;LOCAL USER?
2420:         LSH     AC3,3                   ;NO. SHIFT TO REMOTE-USER FIELD
2421:         LSH     TAC1,2                  ;SHIFT PRIVILEGE BITS TO CHECK PRIV ACCESS
2422:         TDNE    TAC1,DAT                ;IS ACCESS ALLOWED BY PRIVILEGE?
2423:         JRST    (AC1)                   ;YES. PRIV. ACCESS TO FILE
2424:         JRST    PROT2                   ;CHECK NON-OWNER ACCESS
2425: PROT1:  TLZ     DAT,600000              ;OWNER CAN READ OR RENAME
2426: PROT2:  TDNN    DAT,AC3
2427:         JRST    (AC1)                   ;OK
2428:         JRST    EPROT                   ;LOSE
2429: 
2430: PROT3:  TLNE    DAT,500000              ;WRITE OR RENAME ACCESS TO UFD?
2431:         JRST    PROT4                   ;YES. THIS IS USUALLY ILLEGAL
2432:         MOVE    AC2,ACCNAM(DDB)         ;USE THE NAME INSTEAD OF PPN FOR LEGALITY
2433:         JRST    PROT0                   ;OTHERWISE, CONSIDER OTHER CLASS OF USERS
2434: 
2435: PROT4:  JUMPGE  DAT,PROT5               ;JUMP UNLESS 400000 ACCESS REQUESTED
2436:         MOVE    TAC1,FILNAM(DDB)        ;GET NAME OF THIS UFD
2437:         CAMN    TAC1,PRJPRG(J)          ;BELONGS TO US?
2438:         JRST    (AC1)                   ;YES.  PROTECTION CHANGE IS OK.
2439: PROT5:  MOVE    TAC1,JBTPRV(J)          ;WRITE OR RENAME ACCESS TO UFD
2440:         LSH     TAC1,2
2441:         TDNN    TAC1,DAT
2442:         JRST    EPROT
2443:         JUMPL   DAT,(AC1)               ;LEGAL FOR PRIV' USER TO CHANGE PROT
2444:         SKIPN   ACCNAM(DDB)             ;WRITE IS LEGAL ONLY IF DELETING
2445:         JRST    (AC1)
2446:         JRST    EPROT
2447: 
2448: ;HERE TO CHECK ACCESS TO A UFD
2449: UPROTC: MOVE    AC2,ACCPPN(DDB)
2450: UPROTK: SKIPE   AC3,UFDPRO(DDB)
2451:         JRST    PROT0
2452:         JRST    (AC1)                   ;AVOID WORK IF THIS IS A UFD ACCESS
    DSKSER page# 0027 next  prev
2454: ;SEARCH MFD AND UFD FOR FILE.
2455: ;PUT DIRECTORY DATA IN SRCNAM,SRCEXT,SRCPRO,SRCLOC.
2456: ;FLAG IS LEFT IN SRCTMP.
2457: 
2458: ; MFD, UFD FORMAT:
2459: ;       NAME
2460: ;       EXT, DATE CREATED
2461: ;       PROT, MODE, TIME LAST WRITTEN
2462: ;       LOCATION (LOGICAL BLOCK NO.)
2463: 
2464: FILSRC: PUSHJ   P,SRCH
2465:         SKIPE   DAT                             ;WANT MFD?
2466:         PUSHJ   P,QEWAIT                        ;NO, READ DIRECTORY
2467:         TLNE    IOS,LOSBIG
2468:         JRST    EGARPJ
2469:         POPJ    P,
2470: 
2471: UFDSRC: PUSHJ   P,SRCH
2472:         JUMPN   DAT,CPOPJ                       ;RETURN
2473:         JRST    EACMFD                          ;ILLEG MFD OP.
2474: 
2475: SRCH:   MOVEI   TEM,ACCNAM(DDB)
2476: SRCH1:  MOVE    DAT,MFDLOC
2477:         MOVEM   DAT,SRCLOC(DDB)
2478:         MOVE    TAC,UPPN(TEM)
2479:         MOVSI   TAC1,UFDEXT
2480:         HLLZ    AC3,UEXT(TEM)
2481:         CAME    TAC,SYSPPN                      ;LOOKING FOR [1,1] FILE?
2482:         JRST    SRCHM                           ;NO, GO SEARCH MFD FOR UFD
2483:         CAMN    TAC1,AC3                        ;IT IS [1,1], IS IT UFD?
2484:         CAME    TAC,UNAM(TEM)                   ;IS UFD, IS IT MFD?
2485:         JRST    SRCHU                           ;NO, SEARCH MFD FOR IT
2486:         MOVEM   DAT,SRCTMP(DDB)                 ;YES, PLUG IN MFD STUFF
2487:         MOVE    DAT,MFDEXT
2488:         MOVEM   DAT,SRCEXT(DDB)
2489:         MOVE    DAT,MFDPRO
2490:         MOVEM   DAT,SRCPRO(DDB)
2491:         MOVEM   DAT,UFDPRO(DDB)                 ;DEFINE ACCESS ALLOWED TO MFD
2492:         MOVEI   DAT,0                           ;MFD FLAG
2493:         POPJ    P,
2494: 
2495: SRCHM:  MOVEM   TAC,SRCNAM(DDB)
2496:         MOVEM   TAC1,SRCEXT(DDB)
2497:         CAMN TAC,UFDPPN(DDB)                    ;IS PTR TO THIS UFD IN THE DDB?
2498:         SKIPN TAC1,UFDADR(DDB)                  ;YES, JUST GOBBLE IT
2499:         JRST .+2
2500:         JRST CUSSRC
2501:         LDB     TAC1,PUNIT
2502:         JUMPN   TAC1,SRCHM1                     ;DON'T KNOW WHERE ANYTHING IS IF UDP
2503:         CAMN    TAC,CUSPPN                      ;IS THIS THE BLOODY CUSP?
2504:         SKIPN   TAC1,CUSLOC                     ;YES, DO WE REMEMBER WHERE IT IS?
2505:         CAIA                                    ;NO TO ONE OF THESE
2506:         JRST    CUSSRC                          ;YES, GO SEARCH IT
2507: IFN FTDSKPPN,<
2508:         SKIPN   TAC1,DSKPPN(J)
2509:         MOVE    TAC1,PRJPRG(J)
2510:         CAMN    TAC,TAC1                        ;HIS OWN UFD?
2511: >;FTDSKPPN
2512: IFE FTDSKPPN,<  CAMN    TAC,PRJPRG(J) >
2513:         SKIPN   TAC1,JBTUFD(J)                  ;DO WE KNOW WHERE IT IS?
2514:         JRST    SRCHM1                          ;NO. LOOK IN MFD FOR ITS LOC.
2515: CUSSRC: HRRZM   TAC1,SRCLOC(DDB)                ;TRY HERE.
2516:         JRST    SRCHU                           ;GO GET UFD (BYPASS MFD SEARCH)
2517: 
2518: SRCHM1: MOVEI   DAT,DIRSRC                      ;LOOK IN MFD FOR USER'S UFD
2519:         PUSHJ   P,QEWAIT
2520:         TLNE    IOS,LOSBIG
2521:         JRST    EGARJ2
2522:         SKIPG   SRCTMP(DDB)                     ;FOUND IT?
2523:         JRST    ENOUFD                          ;NO, LOSE
2524:         MOVE    TAC1,SRCLOC(DDB)                ;SAVE MOST RECENT UFD ADDR IN DDB
2525:         LDB TAC,PUNIT
2526:         JUMPN TAC,SRCHM2                        ;IF DSK, DON'T SAVE IF IN JBTUFD
2527:         CAME TAC1,JBTUFD(J)
2528:         CAMN TAC1,CUSLOC
2529:         JRST SRCHM3
2530: SRCHM2: MOVE    TAC,SRCNAM(DDB)
2531:         MOVEM TAC,UFDPPN(DDB)
2532:         MOVEM TAC1,UFDADR(DDB)
2533: SRCHM3: LDB     TAC,PUNIT
2534:         JUMPN   TAC,SRCHU                       ;SKIP THIS STUFF IF UDP
2535:         MOVE    TAC,SRCNAM(DDB)                 ;DID WE JUST LOOK AT GUY'S OWN UFD?
2536: IFN FTDSKPPN,<  SKIPN   DAT,DSKPPN(J)
2537:                 MOVE    DAT,PRJPRG(J)
2538:                 CAMN    TAC,DAT         >;FTDSKPPN
2539: IFE FTDSKPPN,<  CAMN    TAC,PRJPRG(J)   >
2540:         MOVEM   TAC1,JBTUFD(J)
2541:         CAMN    TAC,CUSPPN
2542:         MOVEM   TAC1,CUSLOC
2543: SRCHU:  HLLZ    TAC1,UEXT(TEM)
2544:         MOVEM   TAC1,SRCEXT(DDB)
2545:         MOVE    TAC,UNAM(TEM)                   ;LOOK IN UFD FOR FILE
2546:         MOVEM   TAC,SRCNAM(DDB)
2547:         MOVEI   DAT,DIRSRC
2548:         POPJ    P,
2549: 
2550: ;INSERT A FILE NAME IN UFD.
2551: ;UFD RTVL MUST BE IN DDB.
2552: 
2553: DIRINS: MOVEI   DAT,DIRI1                       ;TRY TO PUT NEW NAME IN
2554:         PUSHJ   P,QEWAIT                        ;WITHOUT EXTENDING UFD.
2555:         SKIPN   SRCTMP(DDB)                     ;SUCCESSFUL?
2556:         POPJ    P,                              ;YES, RETURN
2557:         PUSHJ   P,MAKBLK                        ;NO ROOM, GET NEW BLOCK
2558:         MOVEI   DAT,DIRI2
2559:         PUSHJ   P,QEWAIT                        ;WRITE NEW NAME IN IT
2560:         POPJ    P,
2561: 
2562: ;*** INTERRUPT SUBRS ***
2563: 
2564: DIRI1:  SETZM   SRCNAM(DDB)
2565:         PUSHJ   P,DIRSRC                        ;LOOK FOR A HOLE.
2566:         SKIPL   SRCTMP(DDB)                     ;FOUND ONE?
2567:         JRST    DIRIHF                          ;YES, GO USE IT.
2568:         SKIPN   AC1,DDLNG+SYSRTV                ;UFD WD CT
2569:         JRST    DIRI1W                          ;ZERO LENGTH FILE MUST HAVE ROOM
2570:         IDIVI   AC1,BKDSIZ                      ;ROOM IN THIS BLOCK?
2571:         CAIG    AC2,BKDSIZ-4
2572:         JUMPN   AC2,DIRI1W                      ;YES, GO FIX UNLESS INTEGRAL
2573:                                                 ;NUMBER OF BLOCKS
2574:         SETOM   SRCTMP(DDB)                     ;FLAG MORE SPACE NEEDED
2575:         MOVEI   DAT,RCPBLK
2576:         ADDM    DAT,USETP(DDB)
2577:         POPJ    P,                              ;BACK TO UUO LVL TO GET IT.
2578: 
2579: DIRIHF: MOVEI   TAC1,SYSDTA-1(TAC1)
2580:         PUSH    TAC1,ACCNAM(DDB)
2581:         PUSH    TAC1,ACCEXT(DDB)
2582:         PUSH    TAC1,ACCPRO(DDB)
2583:         PUSH    TAC1,FILLOC(DDB)
2584:         SETZM   SRCTMP(DDB)                     ;FLAG SUCCESSFUL.
2585:         JRST    REWRIT                          ;SPIT IT BACK OUT
2586: 
2587: DIRI2:  MOVEI   TAC1,0
2588: DIRI1W: PUSH    P,TAC1
2589:         MOVEI   DAT,4
2590:         ADDM    DAT,DDLNG(DDB)                  ; EXTEND UFD
2591:         PUSHJ   P,SPREAD
2592:         MOVE    TAC,[XWD -BKDSIZ,SYSDTA]        ;RTVL OUT, JUST WRITE DATA!
2593:         MOVEM   TAC,TFRIOW(DDB)
2594:         MOVE    TAC,USETP(DDB)
2595:         PUSHJ   P,LR2BLK
2596:         JUMPE   TAC,[   POP     P,TAC1          ;0 MEANS BAD RETRIEVAL!
2597:                         JRST    SETLOS]
2598:         PUSHJ   P,BKMAP                         ;FINISH MAPPING
2599:         LDB     AC3,PUNIT
2600:         ADD     TAC,BFSETS(AC3)
2601:         MOVEM   TAC,TFRSEC(DDB)
2602:         POP     P,TAC1
2603:         JRST    DIRIHF
2604: 
2605: ;*** I-SUBR TO READ DIRECTORY INTO SYSBUF & SEARCH.
2606: ;RETURNS FLAG IN SRCTMP: -1 IF NOT FOUND
2607: ;       0 IF DIFFERS IN EXT AND SPECIFIED EXT WAS 0
2608: ;       +N IF EXACT MATCH FOUND
2609: 
2610: DIRSRC: MOVE    TAC,SRCLOC(DDB)                 ;LOCATION OF UFD FILE
2611:         PUSHJ   P,NEWFIL
2612:         SETZM   SRCTMP(DDB)
2613:         PUSHJ   P,GETBLK
2614:         MOVE    TAC,DDPPN+SYSRTV                ;BLOCK SHOULD LOOK LIKE UFD.
2615:         HLLZ    TAC1,DDEXT+SYSRTV
2616:         CAMN    TAC,SYSPPN
2617:         CAME    TAC1,MFDEXT
2618:         PUSHJ   P,AUDHAK                        ;IT DOESN'T.
2619:         MOVE    TAC,MFDLOC
2620:         MOVE    TAC1,SYSRTV+DSATID              ;GET SATID OF CURRENT UFD.
2621:         LDB     DAT,PUNIT
2622:         MOVE    DAT,SATADR(DAT)
2623:         CAMN    TAC,SRCLOC(DDB)                 ;IS THIS THE MFD ?
2624:         CAMN    TAC1,SATID(DAT)                 ;YES. AGREES WITH MASTER COPY?
2625:         JRST    DIRSA                           ;YES
2626:         CAME    DAT,SATADR                      ;IS THIS THE MAIN DISK?
2627:         JRST    AUDHAK                          ;NO. SOMEONE SWAPPED PACKS!
2628:         EXCH    TAC1,SATID(DAT)                 ;MAKE IT GOOD, WE HOPE
2629:         MOVE    TAC,SATID(DAT)                  ;MAKE LIFE EASIER IN TYPEOUT
2630:         PUSHACS
2631:         PUSHJ   P,DISDATE
2632:         PUSHJ   P,DISERR
2633:         [ASCIZ/SATID CLOBBERED!
2634: SATID IN CORE=/]
2635:         DISARG(OCT,<-20+TAC1(P)>)               ;SATID IN CORE
2636:         [ASCIZ/
2637: SATID ON DISK=/]
2638:         DISARG(OCT,<-20+TAC(P)>)
2639:         [ASCIZ/
2640: DON'T CONTINUE UNTIL YOU GET A WIZARD.
2641: /]
2642:         -1
2643:         MOVE    TAC,SATID+SATTAB                ;MAKE SURE ALL THE SATID'S AGREE
2644:         MOVEM   TAC,SATID1
2645:         MOVEM   TAC,SATID2
2646:         CONO    PI,PIOFF
2647:         SETOM   DISFLAG                         ;FORCE TYPEOUT
2648:         PUSHJ   P,DISFLUSH
2649:         POPACS
2650:         CONO    PI,PION
2651:         PUSHJ   P,DDTCALL                       ;MAKE HIM DO A CPOPJ$G
2652: DIRSA:  MOVE    TAC1,SYSRTV+DQINFO+3            ;GET DEFAULT FILE PROTECTION
2653:         HLRM    TAC1,UFDPR1(DDB)                ;ICK!
2654:         MOVSI   TAC1,777000
2655:         AND     TAC1,SYSRTV+DDPRO
2656:         MOVEM   TAC1,UFDPRO(DDB)                ;SAVE PROTECTION OF THIS UFD
2657:         SETZ    TAC1,
2658:         MOVN    TEM,DDLNG+SYSRTV                ;GET -WORD COUNT
2659:         JUMPE   TEM,DIRSN                       ;EMPTY DIRECTORY
2660: DIRS1:  MOVEI   TAC1,0
2661: DIRS2:  MOVE    DAT,SYSDTA(TAC1)
2662:         CAME    DAT,SRCNAM(DDB)
2663:         JRST    DIRSX                           ;NOT THIS ONE
2664:         JUMPE   DAT,DIRSRZ                      ;LOOKING FOR HOLE, FOUND ONE
2665:         MOVE    DAT,SYSDTA+1(TAC1)              ;NAME SAME, SAVE STUFF ...
2666:         MOVEM   DAT,SRCTMP(DDB)                 ;FOR EXT CHECK.
2667:         MOVE    TAC,SYSDTA+2(TAC1)
2668:         MOVEM   TAC,SRCPRO(DDB)
2669:         MOVE    TAC,SYSDTA+3(TAC1)              ;FILE LOCN (MUST BE +)
2670:         MOVEM   TAC,SRCLOC(DDB)
2671:         XOR     DAT,SRCEXT(DDB)                 ;COMPARE EXTENSION
2672:         TLNN    DAT,-1
2673:         JRST    DIRSE                           ;MATCHES, THIS IS IT.
2674: DIRSX:  ADDI    TEM,4                           ;INDEXING.
2675:         ADDI    TAC1,4
2676:         JUMPGE  TEM,DIRSF                       ;OUT OF ENTRIES, RETURN FAIL.
2677:         CAIGE   TAC1,BKDSIZ
2678:         JRST    DIRS2
2679:         MOVEI   TAC1,RCPBLK
2680:         ADDM    TAC1,USETP(DDB)
2681:         PUSHJ   P,GETBLK                        ;GET NEXT BLOCK OF DIRECTORY FILE
2682:         JRST    DIRS1
2683: 
2684: DIRSF:  SKIPN   SRCTMP(DDB)                     ;ANY PARTIAL MATCH?
2685:         JRST    DIRSN                           ;NO, RETURN FAIL
2686:         SKIPN   SRCEXT(DDB)                     ;BLANK EXT SPECIFIED?
2687: DIRSRZ: TDZA    TAC,TAC                         ;RETURN MAYBE, IF SO.
2688: DIRSN:  SETOM   TAC                             ;NO, RETURN FAILURE
2689: 
2690: DIRSE:  EXCH    TAC,SRCTMP(DDB)                 ;ENDFILE OR ENTRY FOUND
2691:         MOVEM   TAC,SRCEXT(DDB)                 ;RETURN BEST BET
2692:         POPJ    P,
    DSKSER page# 0028 next  prev
2694: ; RETRIEVAL SUBRS
2695: 
2696: GETRET: MOVEI   DAT,GGRETI                      ;GET RTVL IN IF IT IS NOT
2697:         PUSHJ   P,TSTRET                        ;IS IT?
2698:         PUSHJ   P,QEWAIT                        ;NO, GO GET IT
2699:         PUSHJ   P,TSTRET                        ;IS IT REALLY HERE?
2700:         POPJ    P,                              ;NO, GIVE ERROR RETURN
2701:         JRST    CPOPJ1                          ;YES, SUCCESS.
2702: 
2703: TSTRET: MOVE    TAC,USETP(DDB)                  ;SKIP IF RTVL IS IN.
2704:         SKIPN   TAC1,DGRP1R(DDB)
2705:         POPJ    P,                              ;NOT IN, RETURN
2706:         CAIGE   TAC,RCPGRP(TAC1)
2707:         CAIGE   TAC,(TAC1)
2708:         POPJ    P,                              ;LOSE, WRONG GROUP IN
2709:         JRST    CPOPJ1                          ;IN, SKIP
2710: 
2711: MAKBLK: PUSHJ   P,GETRET                        ;GET GROUP RETRIEVAL IN!
2712:         PUSHJ   P,ASNGRP                        ;NO SUCH GROUP, MAKE ONE
2713:         MOVE    TAC,USETP(DDB)
2714:         PUSHJ   P,LR2BLK                        ;LOOK UP BLOCK IN RTVL.
2715:         JUMPN   TAC,CPOPJ                       ;IT EXISTS, RETURN
2716:         PUSHJ   P,ASNBLK                        ;IT DOESN'T, GET ONE FROM SAT
2717:         TLO     IOS,PNTDIF                      ;NOTE RTVL NOT OUT!!!
2718:         MOVE    AC1,USETP(DDB)                  ;MAKE RTVL ENTRY
2719:         SUB     AC1,DGRP1R(DDB)                 ;PUT ABS BLK PTR IN CORR HALFWD.
2720:         IDIVI   AC1,RCPBLK
2721:         LSHC    AC1,-1
2722:         ADDI    AC1,DPTR(DDB)
2723:         JUMPL   AC2,MAKB3
2724:         HRLM    TAC,(AC1)                       ;EVEN IN LEFT HALF
2725:         POPJ    P,
2726: 
2727: MAKB3:  HRRM    TAC,(AC1)                       ;ODD IN RIGHT HALF
2728:         POPJ    P,
2729: 
2730: ;ASSIGN A BLOCK FOR A NEW GROUP.
2731: 
2732: ASNGRP: PUSHJ   P,ASNBLK                        ;GET BLOCK FROM SAT
2733: ASNGR1: MOVEM   TAC,DNXTGP(DDB)                 ;PUT INTO LINK
2734:         MOVEI   DAT,SPREAD                      ;SMEAR EXISTING RTVL OUT...
2735:         SKIPE   DGRP1R(DDB)                     ;IF THERE IS A CURRENT GROUP.
2736:         PUSHJ   P,QEWAIT
2737:         SETZM   TAC
2738:         EXCH    TAC,DNXTGP(DDB)                 ;NEW BLOCK...
2739:         HRLZM   TAC,DPTR(DDB)                   ;IS FIRST OF NEW GRP.
2740:         SETZM   DPTR+1(DDB)                     ;CLEAR OUT REST OF RTVL.
2741:         HRLI    TAC1,DPTR+1(DDB)
2742:         HRRI    TAC1,DPTR+2(DDB)
2743:         BLT     TAC1,DDEND-1(DDB)
2744:         MOVE    TAC,USETP(DDB)
2745:         MOVEM   TAC,DGRP1R(DDB)
2746:         TLO     IOS,PNTDIF                      ;NOTE NEW RTVL NOT OUT.
2747:         POPJ    P,
2748: 
2749: ;SPREAD UPDATED RTVL OVER BLOCKS IN CURRENT GROUP.
2750: ;NORMALLY WRITES FROM DDB
2751: 
2752: SPREDT: MOVE    AC2,USETP(DDB)                  ;OUT RTVL UP TO CURR BLOCK.
2753:         SUBI    AC2,RCPBLK
2754:         JRST    SPREDF
2755: 
2756: SPREAD: MOVE    AC2,DGRP1R(DDB)                 ;OUT RTVL OVER WHOLE GROUP
2757:         ADDI    AC2,RCPGRP-RCPBLK
2758: 
2759: SPREDF: MOVEI   TAC1,DSKDAT(DDB)
2760: SPREDD: HRLI    TAC1,-SECSIZ
2761:         SKIPN   TEM,DGRP1R(DDB)
2762:         POPJ    P,                              ;NO RTVL TO SPREAD.
2763:         MOVEM   TAC1,TFRIOW(DDB)
2764:         MOVEI   TAC1,DWRITE!IOPDCH
2765:         MOVSM   TAC1,TFRCTL(DDB)
2766: SPREDL: CAMLE   TEM,AC2
2767:         POPJ    P,                              ;DONE WITH GROUP
2768: SPREDR: MOVE    TAC,TEM         
2769:         PUSHJ   P,LR2BLK
2770:         JUMPE   TAC,SPREDI                      ;NON EX BLOCK
2771:         PUSHJ   P,BK2SEC
2772:         LDB     AC3,PUNIT
2773:         ADD     TAC,BFSETS(AC3)
2774:         MOVEM   TAC,TFRSEC(DDB)
2775:         PUSHJ   P,TSTART
2776: SPREDI: ADDI    TEM,RCPBLK
2777:         JRST    SPREDL
2778: 
2779: 
2780: AUDINF: MOVSI   TAC1,FILNAM(DDB)
2781:         HRRI    TAC1,DSKDAT(DDB)                ;BLT AUDIT INFO INTO RTVL
2782:         BLT     TAC1,DSKDAT+7(DDB)
2783:         LDB     TAC1,PUNIT
2784:         MOVE    TAC1,SATADR(TAC1)
2785:         MOVE    TAC1,SATID(TAC1)
2786:         MOVEM   TAC1,DSATID(DDB)
2787:         POPJ    P,
2788: 
2789: AUDCHK: MOVE    TAC,FILNAM(DDB)
2790:         CAME    TAC,DDNAM(DDB)
2791:         TLO     IOS,LOSBIG
2792:         HLLZ    TAC,FILEXT(DDB)
2793:         HLLZ    TAC1,DDEXT(DDB)
2794:         CAME    TAC,TAC1
2795:         TLO     IOS,LOSBIG
2796:         MOVE    TAC,FILPPN(DDB)
2797:         CAME    TAC,DDPPN(DDB)
2798: AUDHAK: TLO     IOS,LOSBIG
2799:         TLNE    IOS,LOSBIG
2800:         MOVEM   DDB,ACDDB                       ;SAVE LOSER FOR DEBUGGING
2801:         POPJ    P,
2802: 
2803: ;SET UP GGRETI TO READ A NEW FILE, WHOSE RTVL ISN'T IN.
2804: 
2805: NEWFIL: CAME    TAC,DDLOC(DDB)                  ;IS RIGHT RTVL IN?
2806: NEWFI1: SETZM   DGRP1R(DDB)                     ;NO, FORCE IT TO BE READ
2807:         MOVEM   TAC,DDLOC(DDB)
2808:         MOVEI   TAC1,1
2809:         MOVEM   TAC1,USETP(DDB)
2810:         POPJ    P,
2811: 
2812: ; GET BLOCK CONTAINING USETP INTO SYSBUF. 
2813: 
2814: GETBLK: PUSHJ   P,GGRETI                        ;GET RTVL IN
2815:         JUMPE   TAC,CPOPJ                       ;NON EX=EOF
2816:         MOVE    TAC,USETP(DDB)
2817:         SKIPN   TFRIOW(DDB)                     ;DID GGRETI READ?
2818:         JRST    GETBK1                          ;NO, GO READ BLOCK
2819:         MOVE    TAC1,DGRP1R(DDB)                ;FIRST GROUP OF BLOCK
2820:         CAIGE   TAC,RCPBLK(TAC1)                ;IS ONE WE WANT IN IN THIS BLOCK?
2821:         POPJ    P,                              ;YES, RETURN.
2822: GETBK1: PUSHJ   P,LR2BLK
2823:         JUMPE   TAC,CPOPJ                       ;NON EX = EOF
2824:         PUSHJ   P,BK2SEC
2825:         LDB     AC3,PUNIT
2826:         ADD     TAC,BFSETS(AC3)
2827:         MOVEM   TAC,TFRSEC(DDB)                 ;READ IT INTO SYSBUF
2828:         MOVE    TAC,BUFIOW
2829:         MOVEM   TAC,TFRIOW(DDB)
2830:         MOVEI   TAC,IOPCHN
2831:         MOVSM   TAC,TFRCTL(DDB)
2832:         PUSHJ   P,TSTART
2833:         POPJ    P,
2834: 
2835: ; GET RTVL FOR GROUP INTO DDB IF NOT ALREADY THERE. 
2836: 
2837: GGRETI: SETZM   TFRIOW(DDB)                     ;FLAG FOR GETBLK.
2838:         SKIPN   TAC1,DGRP1R(DDB)                ;IF NO RTVL IN,
2839:         JRST    GGBLK1                          ;GET BLOCK 1.
2840:         MOVE    TAC,USETP(DDB)
2841:         CAIL    TAC,RCPGRP(TAC1)                ;USETP IN CURRENT GROUP?
2842:         JRST    GGNXT                           ;BEYOND, TRY SUCCESSOR
2843:         CAIL    TAC,(TAC1)
2844:         POPJ    P,                              ;IN THIS ONE.
2845: 
2846: GGBLK1: SKIPA   TAC,DDLOC(DDB)                  ;START AT BEGINNING.
2847: GGNXT:  MOVE    TAC,DNXTGP(DDB)                 ;GO ON TO NEXT GROUP
2848:         JUMPE   TAC,CPOPJ                       ;RETURN IF EOF
2849:         PUSHJ   P,BK2SEC
2850:         LDB     AC3,PUNIT
2851:         ADD     TAC,BFSETS(AC3)
2852:         MOVEM   TAC,TFRSEC(DDB)
2853:         MOVE    TAC,BUFIOW                      ;READ ENTIRE BLOCK...
2854:         MOVEM   TAC,TFRIOW(DDB)
2855:         MOVEI   TAC,IOPCHN
2856:         MOVSM   TAC,TFRCTL(DDB)
2857:         PUSHJ   P,TSTART                        ;IN CASE SOMEONE WANTS IT.
2858:         HRLI    TAC,SYSBUF                      ;GOT CORRECT GRP. BLT RTVL
2859:         HRRI    TAC,DSKDAT(DDB)                 ;AND AUDIT TO DDB.
2860:         BLT     TAC,DSKDAT+SECSIZ-1(DDB)
2861:         MOVE    TAC,USETP(DDB)
2862:         MOVE    TAC1,DGRP1R+SYSRTV
2863:         CAIL    TAC,RCPGRP(TAC1)                ;IN THIS GROUP?
2864:         JRST    GGNXT
2865:         POPJ    P,
2866: 
2867: ;LOGICAL RECORD TO BLOCK. CORRECT GROUP IS ASSUMED.
2868: 
2869: LR2BLK: SUB     TAC,DGRP1R(DDB)
2870:         CAIL    TAC,0
2871:         CAIL    TAC,RCPGRP
2872:         MOVEI   TAC,1                           ;WRONG GROUP.DEFAULT SELECT REC1.
2873:         IDIVI   TAC,RCPBLK
2874:         MOVEI   AC3,1(TAC1)             ;PHYSICAL RECORD WITHIN BLOCK (INCL RTRVL)
2875:         LSHC    TAC,-1
2876:         ADDI    TAC,DPTR(DDB)
2877:         MOVE    TAC,(TAC)
2878:         SKIPL   TAC1
2879:         HLRS    TAC
2880:         HRRZS   TAC
2881:         POPJ    P,
2882: 
2883: 
2884: ;CONVERT BLOCK NO. TO DISK ADDRESS OF FIRST RECORD OF BLOCK
2885: BK2SEC: SETZ    AC3,
2886: ;MAPPING BLOCK NO. AND RECORD NO. TO DISK ADDRESS
2887: BKMAP:  LSH     TAC,6                           ;TO STOP LATER.
2888:         ANDI    AC3,77                          ;IGNORE IMPOSSIBLE RECORD NOS.
2889:         IOR     TAC,AC3
2890:         POPJ    P,
    DSKSER page# 0029 next  prev
2892: ; SAT TABLE OPERATIONS
2893: 
2894: CUSATO: LDB     TAC,PUNIT
2895:         SKIPE   SATMOD(TAC)             ;SAT OUT FROM UUO LEVEL, IF CHANGED.
2896:         SKIPG   TAC1,SATADR(TAC)                ;ADDRESS OF SAT TABLE
2897:         POPJ    P,                      ;NO CHANGE, RETURN
2898:         MOVE    DAT,TIME                ;GET CURRENT TIME
2899:         MOVEM   DAT,DTIME(TAC1)         ;SAVE IN SAT TABLE
2900:         MOVE    DAT,THSDAT
2901:         MOVEM   DAT,DDATE(TAC1)         ;AND CURRENT DATE
2902:         MOVEI   DAT,SATOUT
2903:         JUMPE   TAC,NENTER              ;IF MAIN DISK, QUEUE THIS AND POPJ
2904:         HRLI    TAC1,-USATSZ
2905:         MOVEM   TAC1,TFRIOW(DDB)        ;SET THIS FOR USATOUT
2906:         MOVEI   DAT,USATOUT
2907:         PUSHJ   P,NENTER
2908:         TRNN    IOS,IODERR!IOIMPM
2909:         POPJ    P,
2910: SATGLZ: PUSHJ   P,ERZIOS                        ;UN-INITIALIZED UDP.
2911:         JSP     TAC,ERRPTU
2912:         ASCIZ   /UDP OFFLINE OR WRITE LOCKED/
2913:         JRST    EXCALP
2914: 
2915: ;*** I-SUBR
2916: SATOUT: SKIPA   TAC,[DWRITE!IOPCHN]     ;WRITE SAT
2917: SATIN:  MOVEI   TAC,IOPCHN              ;READ SAT
2918:         TLO     IOS,SATOP
2919:         MOVSM   TAC,TFRCTL(DDB)
2920:         MOVE    TAC,[XWD -SATSIZ,SATTAB]
2921:         MOVEM   TAC,TFRIOW(DDB)         ;IOWD FOR THIS TRANSFER
2922:         SETZM   TFRSEC(DDB)
2923:         PUSHJ   P,TSTART
2924:         SETZM   SATMOD
2925:         TLZ     IOS,SATOP
2926:         POPJ    P,
2927: 
2928: ASNBLK: PUSHJ   P,IASNBK                ;ASSIGN SUITABLE BLOCK
2929:         PUSH    P,TAC
2930:         MOVEM   TAC,TFRSEC(DDB)         ;SAVE HERE FOR I SUBR
2931:         MOVEI   DAT,RB4WCK              ;READ BEFORE WRITE CHECKER
2932:         PUSHJ   P,QEWAIT
2933:         POP     P,TAC
2934:         SKIPN   TFRIOW(DDB)             ;SUCCESS?
2935:         JRST    ASNBLK                  ;NO, ASSIGN ANOTHER BLOCK
2936:         POPJ    P,
2937: 
2938: ; READ BEFORE WRITE CHECKER ** I SUBR
2939: RB4WCK: SKIPN   TAC,TFRSEC(DDB)         ;GET LOGICAL DISK ADDRESS
2940:         JRST    RB4WLS                  ;LOSE IF ADDRESS IS 0
2941:         PUSHJ   P,BK2SEC                ;CONVERT TO PHYSICAL ADDRESS
2942:         LDB     AC3,PUNIT
2943:         ADD     TAC,BFSETS(AC3)
2944:         MOVEM   TAC,TFRSEC(DDB)         ;AND PUT IT BACK
2945:         MOVE    TAC,[XWD -SECSIZ,QBUF]
2946:         MOVEM   TAC,TFRIOW(DDB)
2947:         MOVEI   TAC,IOPCHN
2948:         MOVSM   TAC,TFRCTL(DDB)         ;READ OP
2949:         PUSHJ   P,TSTART
2950:         MOVE    IOS,DEVIOS(DDB)
2951:         TRNE    IOS,IODERR!IODTER       ;LOSE ON READ?
2952:         JRST    RB4WER                  ;YES, USE ANOTHER
2953:         SKIPE   QBUF+DDNAM-DSKDAT       ;NULL FILE NAME?
2954:         SKIPN   QBUF+DDPPN-DSKDAT       ;OR PPN?
2955:         POPJ    P,                      ;YES, OK TO WRITE HERE
2956:         LDB     TAC,PUNIT
2957:         MOVE    TAC,SATADR(TAC)
2958:         MOVE    TAC,SATID(TAC)          ;GET SATID FROM CORE
2959:         CAME    TAC,QBUF+DSATID-DSKDAT  ;SAME AS ON DISK?
2960:         POPJ    P,                      ;NO. INVALID SATID MEANS WE CAN WRITE HERE
2961: RB4WLS: AOS     DSKOVC                  ;COUNT OVERWRITE CHECK
2962: RB4WER: SETZM   TFRIOW(DDB)             ;FLAG ILLEGAL BLOCK
2963:         POPJ    P,
2964: 
2965: 
2966: ;MANIPULATE THE UDP SAT TABLE
2967: 
2968: SATGT0: MOVEI   DAT,CPOPJ                       ;WAIT IN DISK QUEUE AND DO NOTHING!
2969:         PUSHJ   P,NEWAIT
2970: SATGET: LDB     TAC1,PUNIT
2971:         SKIPLE  AC3,SATADR(TAC1)                ;IS THE SAT IN FOR THIS DEVICE?
2972:         POPJ    P,                              ;YES.
2973:         JUMPL   AC3,SATGT0                      ;JUMP IF SOMEONE ELSE BRINGING IT IN
2974:         SETOM   SATADR(TAC1)                    ;FLAG WE SHALL BRING IT IN.
2975:         MOVEI   AC3,USATSZ                      ;SIZE OF SAT TABLE
2976:         PUSHJ   P,UFSGET                        ;GET FS. WAIT IF NEEDED
2977:         HRLI    AC1,-USATSZ                     ;FORM WCMA
2978:         MOVEM   AC1,TFRIOW(DDB)                 ;SET IT IN THE DDB
2979:         MOVEI   DAT,USATIN
2980:         PUSHJ   P,NEWAIT                        ;CAUSE SAT TO BE READ AND WAIT FOR IT.
2981:         TRNE    IOS,IOIMPM!IODERR               ;ERROR?
2982:         JRST    SATGL1                          ;YES.  GIVE BACK FREE STG
2983:         LDB     TAC,PUNIT
2984:         MOVE    TAC1,SATADR(TAC)
2985:         MOVE    AC1,IDSAT(TAC1)
2986:         CAMN    AC1,['SATID ']
2987:         JRST    ACISTT                          ;FORM DSKUSE, BADCHK, ETC,
2988:         PUSHJ   P,ERZIOS                        ;UN-INITIALIZED UDP.
2989:         JSP     TAC,ERRPTU
2990:         ASCIZ   /NOT A NEW FORMAT UDP/
2991:         JRST    EXCALP
2992: 
2993: ;LOST TRYING TO READ IN SATTAB.  PROBABLY NO PACK MOUNTED
2994: ;GIVE BACK FREE STORAGE AND GIVE OFFLINE COMPLAINT
2995: SATGL1: HRRZ AC1,TFRIOW(DDB)                    ;ADDRESS OF WOULD BE SATTAB
2996:         PUSHJ P,FSGIVE                          ;RETURN THE BLOCK
2997:         JRST SATGLZ
2998: 
2999: ;*** I-LEVEL SUBR
3000: ;TFRIOW SETUP BY CALLER!
3001: USATOUT:SKIPA   TAC,[DWRITE!IOPCHN]
3002: USATIN: MOVEI   TAC,IOPCHN
3003:         MOVSM   TAC,TFRCTL(DDB)                 ;SET READ/WRITE MODE
3004:         TLO     IOS,SATOP
3005:         LDB     TAC,PUNIT
3006:         MOVE    TAC,BFSET(TAC)                  ;DISK ADDRESS OF SAT TABLE
3007:         PUSHJ   P,BK2SEC                        ;CONVERT BLOCK TO SECTOR
3008:         MOVEM   TAC,TFRSEC(DDB)
3009:         PUSHJ   P,TSTART
3010:         TLZ     IOS,SATOP
3011:         LDB     TAC,PUNIT
3012:         SETZM   SATMOD(TAC)
3013:         TRNE    IOS,IODERR!IODTER!IOIMPM
3014:         TDZA    TAC1,TAC1                       ;SATTAB DIDN'T MAKE IT IN
3015:         HRRZ    TAC1,TFRIOW(DDB)
3016:         MOVEM   TAC1,SATADR(TAC)                ;SET SATADR - RACE FREE!
3017:         POPJ    P,
    DSKSER page# 0030 next  prev
3019: ;IASNBK
3020: ;THIS CODE BLOWS HORNY TOADS, SOMEONE OUGHT TO FIX IT. - REG
3021: 
3022: ASNST1: CONO    PI,IOPON                ;TURN IOP BACK ON
3023:         PUSHJ   P,EDFULL                ;"DISK IS FULL" MESSAGE
3024:                                         ;LET HIM TRY AGAIN, IF HE SAYS CONTINUE
3025: IASNBK: LDB     AC3,PUNIT
3026:         MOVE    AC3,SATADR(AC3)         ;ADDRESS OF SAT TABLE FOR THIS DEV
3027:         MOVE    AC2,LSTBLK(AC3)         ;LAST PLACE WE ASSIGNED BLOCK
3028:         AOJA    AC2,ASNSL2              ;START BEYOND THAT
3029: ASNSL1: CONO    PI,IOPON                ;LET THE IOP IN FOR A QUICK LOOK.
3030: ASNSL2: CONO    PI,IOPOFF
3031:         LDB     TAC,PUNIT
3032:         CAML    AC2,LSTBTB(TAC)         ;OFF THE END YET?
3033:         MOVEI   AC2,1                   ;YES. START OVER.
3034:         CAMN    AC2,LSTBLK(AC3)         ;WRAP TO WHERE WE STARTED?
3035:         JRST    ASNST1                  ;YES. ICK. THERE'S NO DISK LEFT
3036:         MOVE    TAC,AC2                 ;CONVERT BLOCK NUMBER TO BIT AND WORD #
3037:         IDIVI   TAC,44                  ;WORD NUMBER IN TAC, BIT NUMBER IN TAC1
3038:         MOVEI   AC1,1                   ;MAKE A BIT MASK
3039:         ROT     AC1,(TAC1)
3040:         ADDI    TAC,(AC3)
3041:         TDNE    AC1,SATBIT(TAC)         ;THIS BLOCK IN USE?
3042:         AOJA    AC2,ASNSL1              ;YES, KEEP LOOKING
3043:         IORM    AC1,SATBIT(TAC)         ;MARK IN USE
3044:         LDB     TAC,PUNIT
3045:         SETOM   SATMOD(TAC)             ;FLAG SAT TABLE IS BEING CHANGED
3046:         XORM    AC1,SATCHK(AC3)         ;UPDATE CHECKSUM.
3047:         CONO    PI,IOPON                ;LET THEM BACK IN
3048:         MOVEM   AC2,LSTBLK(AC3)         ;REMEMBER THE LAST BLOCK THAT WAS USED
3049:         AOS     TAC,AC2                 ;RETURN EXCESS 1 IN TAC.  (AVOID 0)
3050:         AOS     DSKUSE(AC3)             ;COUNT ANOTHER BLOCK IN USE
3051:         SKIPG   AC1,BADCNT(AC3)
3052:         POPJ    P,
3053:         CAILE   AC1,BADMAX
3054:         MOVEI   AC1,BADMAX
3055:         HRLOI   AC1,-1(AC1)
3056:         EQVI    AC1,(AC3)               ;-BADCNT,,ADDRESS OF SAT TABLE
3057:         CAMN    TAC,BADTRK(AC1)         ;SKIP UNLESS THIS BLOCK IS BAD
3058:         JRST    IASNBK                  ;ASSIGN SOME OTHER BLOCK.
3059:         AOBJN   AC1,.-2
3060:         POPJ    P,
3061: 
3062: 
3063: RTNBLK: LDB     AC1,PUNIT
3064:         CAMG    TAC,LSTBTB(AC1)         ;SKIP IF INVALID BLOCK.
3065:         SOJGE   TAC,.+2                 ;REMOVE EXCESS 1 AND JUMP IF VALID
3066:         POPJ    P,                      ;INVALID BLOCK
3067:         IDIVI   TAC,44
3068:         ADD     TAC,SATADR(AC1)
3069:         MOVEI   AC1,1
3070:         ROT     AC1,(TAC1)
3071:         TDNN    AC1,SATBIT(TAC)
3072:         POPJ    P,                      ;ALREADY OFF!
3073:         ANDCAM  AC1,SATBIT(TAC)
3074:         LDB     TAC,PUNIT
3075:         SETOM   SATMOD(TAC)             ;FLAG SAT TABLE NEEDS OUTPUT
3076:         MOVE    TAC,SATADR(TAC)
3077:         XORM    AC1,SATCHK(TAC) ;UPDATE CHECKSUM.
3078:         SOS     DSKUSE(TAC)             ;DECREASE COUNT
3079:         POPJ    P,
3080: 
3081: MRKBLK:LDB     AC1,PUNIT
3082:         CAMG    TAC,LSTBTB(AC1)         ;SKIP IF INVALID BLOCK.
3083:         SOJGE   TAC,.+2                 ;REMOVE EXCESS 1 AND JUMP IF VALID
3084:         POPJ    P,                      ;INVALID BLOCK
3085:         IDIVI   TAC,44
3086:         ADD     TAC,SATADR(AC1)
3087:         MOVEI   AC1,1
3088:         ROT     AC1,(TAC1)
3089:         TDNE    AC1,SATBIT(TAC)
3090:         POPJ    P,                      ;ALREADY OFF!
3091:         IORM    AC1,SATBIT(TAC)
3092:         LDB     TAC,PUNIT
3093:         SETOM   SATMOD(TAC)             ;FLAG SAT TABLE NEEDS OUTPUT
3094:         MOVE    TAC,SATADR(TAC)
3095:         XORM    AC1,SATCHK(TAC) ;UPDATE CHECKSUM.
3096:         AOS     DSKUSE(TAC)             ;DECREASE COUNT
3097:         POPJ    P,
3098: 
3099: CSATID: LDB     TAC,PUNIT
3100:         JUMPN   TAC,CPOPJ               ;DON'T BOTHER CHECKING SATID FOR UDPS
3101:         MOVE    TAC,SATID+SATTAB
3102:         CAMN    TAC,SATID1
3103:         CAME    TAC,SATID2
3104:         CAIA
3105:         POPJ    P,
3106:         PUSHACS
3107:         PUSHJ   P,DISDAT
3108:         PUSHJ   P,DISERR
3109:         [ASCIZ/BACKUP SATID'S DISAGREE.
3110: SATID = /]
3111:         DISARG  OCT,SATID+SATTAB
3112:         [ASCIZ/
3113: SATID1 = /]
3114:         DISARG OCT,SATID1
3115:         [ASCIZ/
3116: SATID2 = /]
3117:         DISARG OCT,SATID2
3118:         [ASCIZ/
3119: DON'T DO ANYTHING 'TILL YOU GET A WIZARD!
3120: /]
3121:         -1
3122:         SETOM   DISFLAG
3123:         PUSHJ   P,DISFLUSH
3124:         POPACS
3125:         PUSHJ   P,DDTCAL
3126:         JRST    CSATID
3127: 
3128: ;CALLED FROM ERROR2 IN DSKERR INSIDE PUSHACS
3129: MRKBAD: SKIPGE  TAC,DSKLRN              ;LOGICAL NO. OF THIS TRACK
3130: ;       CAILE   TAC,LSTBIT              ;DON'T BAD TRACK UDP!!(NOT ANYMORE)
3131:         POPJ    P,                      ;IF SAT OR SWAP IGNORE.
3132: ;GUARANTEED FILE SYSTEM OP IF DSKLRN < 0 (I THINK THEY MEAN > --BH)
3133:         MOVE DDB,DSKACS+DDB
3134:         LDB AC1,PUNIT
3135:         SKIPN AC1,SATADR(AC1)           ;DOUBLE CHECK THAT THERE'S A SAT
3136:         POPJ P,                         ;ELSE RESTORE ACS
3137:         SKIPN   TAC1,BADCNT(AC1)        ;GET NUMBER OF ENTRIES IN TABLE
3138:         JRST    MRKBD1                  ;NONE YET
3139:         CAILE   TAC1,BADMAX             ;ONLY CHECK EXISTING TABLE
3140:         MOVEI   TAC1,BADMAX
3141: MRKBD0: MOVEI AC2,(AC1)
3142:         ADDI AC2,(TAC1)
3143:         CAMN    TAC,BADTRK-1(AC2)       ;IS THIS BAND ALREADY IN TBL ?
3144:         POPJ P,                         ;YES. DON'T ENTER IT AGAIN.
3145:         SOJG    TAC1,MRKBD0
3146: MRKBD1: AOS     TAC1,BADCNT(AC1)        ;INC. NO. OF BAD TRACKS IN TABLE.
3147:         CAIGE   TAC1,BADMAX             ;TOO MANY FOR ONE UNIVERSE ?
3148:         JRST    MRKBD2                  ;NO, GO ON
3149:         PUSHJ   P,DISMES
3150:         ASCIZ   /TOO MANY BAD DISK TRACKS.  GET A WIZARD, OR PUSH CONTINUE
3151: /
3152:         SETOM   DISFLAG
3153:         PUSHJ   P,DISFLUSH
3154:         HALT    CPOPJ
3155: 
3156: MRKBD2: ADDI TAC1,(AC1)
3157:         MOVEM   TAC,BADTRK-1(TAC1)      ;ADD CURRENT TRACK TO BAD TRACK TABLE.
3158:         ADDM    TAC,BADCHK(AC1)         ;UPDATE THE CHECKSUM.
3159:         PUSH P,BADCNT(AC1)              ;(MRKBLK CLOBBERS AC1)
3160:         PUSHJ   P,MRKBLK                ;MARK TRACK IN SAT TABLE, SO IT WON'T GET USED
3161:         PUSHJ   P,DISMES
3162:         ASCIZ   /NEW BAD DISK TRACK.  BADCNT=/
3163:         POP P,TAC
3164:         PUSHJ   P,DISDCP
3165:         PUSHJ   P,DISMES
3166:         ASCIZ   /       BADMAX=/
3167:         MOVEI   TAC,BADMAX
3168:         PUSHJ   P,DISDCP
3169:         JRST DISCRLF
    DSKSER page# 0031 next  prev
3171: ;DELETE A FILE, FREE DISK BLOCKS
3172: 
3173: DELETE: PUSHJ   P,NEWFIL                ;SET UP RTVL FETCH
3174:         MOVEI   DAT,DELFIL
3175:         MOVE    AC1,FILLNG(DDB)
3176:         CAILE   AC1,=50*2000
3177:         JRST    NEWAIT                  ;MARK ALL BLOCKS EMPTY, CLEAR RTVL
3178:         JRST    QEWAIT
3179: 
3180: ;*** INTERRUPT SUBR ***
3181: 
3182: DELFIL: PUSHJ   P,DELBLK
3183:         TRZE    IOS,IODTER              ;WAS THERE AN ERROR ?
3184:         JRST    DSIOS
3185:         MOVE    TAC,USETP(DDB)
3186: DELF2:  PUSHJ   P,LR2BLK                ;RETURN BLOCKS TO SAT
3187:         JUMPE   TAC,.+2                 ;NO SUCH BLOCK
3188:         PUSHJ   P,RTNBLK
3189:         MOVEI   TAC,RCPBLK
3190:         ADDB    TAC,USETP(DDB)
3191:         MOVE    TAC1,DGRP1R(DDB)
3192:         CAIGE   TAC,RCPGRP(TAC1)        ;HAVE WE GOT TO NXT GRP?
3193:         JRST    DELF2                   ;STILL IN THIS ONE, CONTINUE
3194: DELF3:  SKIPE   DNXTGP(DDB)             ;IS THERE A NEXT GROUP?
3195:         JRST    DELFIL                  ;YES, DO IT
3196:         POPJ    P,
3197: 
3198: DELBLK: PUSHJ   P,GGRETI                ;GET INTO CORE
3199:         PUSHJ   P,AUDCHK
3200:         TLZE    IOS,LOSBIG
3201:         JRST    DELBK1
3202:         LDB     AC2,PJOBN               ;GET JOB # OF LOSER DELETING FILE
3203:         MOVE    AC1,JOBNAM(AC2)         ;NOW REMEMBER SOMETHING ABOUT HIM
3204:         MOVEM   AC1,DQINFO+2(DDB)
3205:         MOVE    AC1,PRJPRG(AC2)
3206:         MOVEM   AC1,DQINFO+3(DDB)
3207:         SETZM   DSATID(DDB)             ;JUST CLEAR SATID TO FREE THIS BLOCK
3208:         JRST    SPREAD                  ;AND POOT IT BACK OUT
3209: 
3210: DELBK1: TRO     IOS,IODTER
3211:         JRST    DSIOS
    DSKSER page# 0032 next  prev
3213: ; SWAPPER INTERFACE
3214: 
3215: ;       EXTERNAL SERACT,JOBDAC,MJOBCK,FINISH,JBTCHK,SERA
3216: ;       INTERNAL DFWRT,DFRED
3217: 
3218: ;ENTER HERE FROM SWAPPER TO START SWAP (DISK IDLE.)
3219: ;TAC=DISK ADDR=SERA; TAC1=IOWD=SQREQ.
3220: 
3221: DFWRT:
3222: DFRED: CONO    PI,IOPOFF               ;JUST FOR SAFETY.
3223:         PUSHJ   P,DSSTRT
3224:         MOVSI   17,UUOACS               ;RETURN HERE AFTER STARTING XFER
3225:         BLT     17,17                   ;RELOAD CH7 AC'S (ESP. P)
3226:         CONO    PI,IOPON                ;SAFE NOW
3227:         POPJ    P,                      ;GO TO SWPXIT
3228: 
3229: DSSTRT: POP     P,INTRTN
3230:         JSR     DSKSV                   ;SET UP CH6 PDL.
3231:         PUSHJ   P,SQGOX1                ;RETURNS HERE WHEN XFER DONE
3232:         JRST    DNSTR1                  ;GO DO NEXT I-SUBR.
3233: 
3234: ;ENTER HERE FROM DISK QUEUE SERVICE AFTER FINISHING I-SUBR.
3235: 
3236: SQGOA:  MOVEI   TAC1,TRIES
3237:         MOVEM   TAC1,SERACT
3238:         MOVSI   TAC,200000              ;PUT IN A BIT...
3239:         ORB     TAC,SERA                ;TO INDICATE SWAP OP.
3240:         MOVE    TAC1,SQREQ
3241:         MOVM    J,FINISH
3242:         HRRO    J,J                     ;NEG TO INDICATE SWAPPER
3243:         PUSHJ   P,SQGOX                 ;DO SWAP OP.
3244:         JRST    DNSTR1                  ;GO DO NEXT I-SUBR.
3245: 
3246: ;SET UP SWAP OPERATION AND EXECUTE IT.
3247: ;ENTER WITH TAC=DISK ADDR=SERA; +1B0 IF INCOMING.
3248: ;TAC1=IOWD=SQREQ.
3249: 
3250: SQGOX1: ADDI    TAC1,1                  ;CONVERT IOWD TO 167 FORMAT
3251: SQGOX:  MOVE    DDB,SWPDDB              ;GET THE RIGHT DDB
3252:         MOVEM   TAC1,TFRIOW(DDB)
3253:         MOVEI   DAT,IOPCHN
3254:         SKIPL   SERA
3255:         TRO     DAT,DWRITE
3256:         MOVSM   DAT,TFRCTL(DDB)
3257:         PUSHJ   P,SBK2SC                ;SPECIAL BLOCK TO SECTOR
3258:         MOVEM   TAC,TFRSEC(DDB)
3259: SQGO2:  SETZB   IOS,DEVIOS(DDB)         ;MAKE SURE THERE ARE NO ERROR BITS ON!
3260:         PUSHJ   P,SETACT
3261:         PUSHJ   P,TGO                   ;ZORCH
3262:         MOVEI   IOS,IOACT
3263:         ANDCAB  IOS,DEVIOS(DDB)
3264:         TRNE    IOS,IOIMPM              ;IMMEDIATE ERROR?
3265:         JRST    SWPLUZ
3266:         TRNE    IOS,IODERR!IODTER
3267:         JRST    SWPERR
3268:         JRST    SNOERR                  ;NO ERRORS
3269: 
3270: SWPLUZ: PUSHACS
3271:         PUSHJ   P,DISMES
3272:         ASCIZ   /SWAPPING PACK OFF LINE OR IN WRITE LOCK!
3273: PLEASE FIX IT AND CONTINUE.
3274: /
3275:         SETOM   DISFLAG
3276:         PUSHJ   P,DISFLUSH
3277:         POPACS
3278:         HALT    SQGO2
3279: 
3280: SWPERR: SOSLE   SERACT                  ;COUNT DOWN
3281:         JRST    SQGO2                   ;TRY AGAIN
3282:         TRO     IOS,IODERR              ;TRIED ENOUGH, DIE
3283: 
3284: SNOERR: MOVE    TAC,IOS
3285:         ANDI    TAC,IODERR!IODTER       ;GET ERROR BITS, IF ANY.
3286:         MOVEM   TAC,SERA                ;GIVE TO SWAPPER.
3287:         SETZM   SQREQ
3288:         SETZM   SWPCNT                  ;WAKE UP SWAPPER.
3289:         POPJ    P,
3290: 
3291: ;MORE MISC: CONVERT SWPSER BLOCK ADDRESS TO DISC ADDRESS.
3292: ;COURTESY J. SAUTER
3293: 
3294: SBK2SC: HRRZ    TAC,TAC
3295:         IDIVI   TAC,1140                ;↑D1216/2
3296:         LSH     TAC,14                  ;MAKE BAND NO.
3297:         TLO     TAC,400000              ;INDICATE SWAP OP
3298:         POPJ    P,
    DSKSER page# 0033 next  prev
3300: ;ENTER HERE FOR HIGH PRIORITY TRANSFER (CURRENTLY ONLY UDP IO).
3301: UEWAIT: TDZE    IOS,[XWD DEVSBB,IOACT]
3302:         PUSHJ   P,WSYNC
3303:         MOVSI   AC1,DEVIBF
3304:         ANDCAM  AC1,DEVCMR(DDB)
3305:         PUSHJ   P,SETACT
3306:         PUSHJ   P,QUE1                  ;MERGE WITH Q-ENTER CODE
3307:         JRST    WSYNC                   ;AND WAIT FOR FINISH
3308: 
3309: ;ENTER I-SUBR CALL IN QUEUE FROM UUO LEVEL.
3310: 
3311: QEWAIT: PUSH    P,PWSYNC                ;QUEUE REQUEST. RETURN TO WSYNC TO WAIT
3312: QENTER: TDZE    IOS,[XWD DEVSBB,IOACT]
3313:         PUSHJ   P,WSYNC                 ;JUST IN CASE SOMEBODY GOOFED.
3314:         MOVSI   AC1,DEVIBF
3315:         ANDCAM  AC1,DEVCMR(DDB)
3316:         PUSHJ   P,SETACT                ;STORES IOS
3317: QE1:    TDZA    AC1,AC1                 ;SELECT NORMAL DISK QUEUE
3318: QUE1:   MOVEI   AC1,1                   ;SELECT UDP QUEUE
3319:         SKIPE   @MIPTR(AC1)
3320:         JRST    .-1                     ;CRASH IF QUEUE FULL
3321:         CONO    PI,IOPOFF               ;INTS OFF UNTIL IACTIV:
3322:         HRLM    DDB,@MIPTR(AC1)         ;DDB ADDR...
3323:         HRRM    DAT,@MIPTR(AC1)         ;AND SUBROUTINE ADDR.
3324:         AOS     DAT,MIPTR(AC1)          ;BUMP QUEUE POINTER
3325:         AOS     DQCNT                   ;ANOTHER LOSER INTO QUEUE
3326:         CAML    DAT,MQEND(AC1)
3327:         MOVE    DAT,MQBEG(AC1)
3328:         MOVEM   DAT,MIPTR(AC1)
3329:         MOVNI   DAT,1
3330:         EXCH    DAT,DFBUSY
3331:         JUMPN   DAT,IACTIV              ;RETURN IF INT PGM RUNNING.
3332:         PUSHJ   P,DIGO                  ;SAVE UUO AC'S, START I-LEVEL
3333: INSRTN: MOVSI   17,UUOACS               ;RELOAD UUO AC'S FROM INT. SAVE.
3334:         BLT     17,17                   ;CH6 INTS INHIBITED UNTIL THIS DONE.
3335: IACTIV: CONO    PI,IOPON
3336: PWSYNC: POPJ    P,WSYNC                 ;RETURN TO UUO CALLER.
3337: 
3338: 
3339: NEWAIT: PUSH    P,PWSYNC                ;RETURN FROM NENTER TO WSYNC
3340: NENTER: TDZE    IOS,[XWD DEVSBB,IOACT]
3341:         PUSHJ   P,WSYNC
3342:         MOVSI   AC1,DEVIBF
3343:         ORM     AC1,DEVCMR(DDB)
3344:         TLO     IOS,DEVSBB
3345:         MOVEM   IOS,DEVIOS(DDB)
3346:         JRST    QE1
3347: 
3348:                                         ;RETURN HERE FROM TSTART WITH I-AC'S SAVED.
3349: DIGO:   POP     P,INTRTN                ;ARRANGE I-LEVEL DISMISS
3350:         JSR     DSKSV                   ;SAVE UUO AC'S IN CH6 AREA.  MUST NOT HAVE
3351:                                         ;CH6 INTERRUPT UNTIL THESE ARE RESTORED.
3352:                                         ;SET UP I-LEVEL PDL (OTHER AC'S NOT NEEDED)
3353:         JRST    DNSTRT                  ;GO CALL SUBR
    DSKSER page# 0034 next  prev
3355: ;I-LEVEL SUBRS RETURN HERE WHEN DONE TO START ANOTHER REQUEST.
3356: 
3357: 
3358: DNXTRQ: MOVE    AC1,QALT
3359:         SETZM   @MOPTR+1(AC1)           ;WIPE OUT RQ JUST FINISHED
3360:         AOS     TAC,MOPTR+1(AC1)        ;ADVANCE POINTER
3361:         SOS     DQCNT                   ;ONE LESS LOSER IN QUEUE
3362:         CAML    TAC,MQEND+1(AC1)
3363:         MOVE    TAC,MQBEG+1(AC1)
3364:         MOVEM   TAC,MOPTR+1(AC1)
3365: 
3366: DNSTRT: SKIPE   SQREQ                   ;IF SWAPPER WANTS SOMETHING,
3367:         JRST    SQGOA                   ;GO SEE ABOUT IT.
3368: DNSTR1: SETCMB  AC1,QALT                ;SELECT A QUEUE
3369:         SKIPN   TAC,@MOPTR+1(AC1)       ;GET NEXT REQUEST.
3370:         JRST    DFSTOP                  ;NONE PENDING, FLAG IDLE
3371:         PUSHJ   P,DSETUP                ;COMMON SETUP AND DISPATCH
3372: ISRTN:  JRST    DNXTRQ
3373: 
3374: DFSTOP: SETCA   AC1,AC1
3375:         SKIPE   @MOPTR+1(AC1)
3376:         JRST    DNSTRT                  ;OTHER QUEUE HAS SOMETHING.  DO IT
3377:         SETZM   DFBUSY
3378:         JRST    @INTRTN                 ;RESTORE USER AC'S, DISMISS
3379: 
3380: DSETUP: HLRZ    DDB,TAC
3381:         SETZB   PROG,BKIN               ;FLAG SYSBUF EMPTY
3382:         MOVE    IOS,DEVIOS(DDB)
3383:         LDB     J,PJOBN
3384:         MOVSI   AC1,DEVIBF
3385:         TDNE    AC1,DEVCMR(DDB)
3386:         JRST    DNSTR2
3387:         TLZE    IOS,DEVSBB
3388:         PUSHJ   P,MESS2
3389:         SKIPE   J
3390:         SKIPE   PROG,JBTADR(J)
3391:         TRON    IOS,IOACT
3392:         PUSHJ   P,MESS3
3393:         JRST    DNSTR3
3394: 
3395: DNSTR2: TRZE    IOS,IOACT
3396:         PUSHJ   P,MESS4
3397:         TLON    IOS,DEVSBB
3398:         PUSHJ   P,MESS5
3399: DNSTR3: PUSHJ   P,(TAC)                 ;CALL SUBR
3400: DRQDN:  MOVSI   AC1,DEVIBF
3401:         ANDCAM  AC1,DEVCMR(DDB)
3402:         TDZN    IOS,[XWD DEVSBB,IOACT]  ;MOST SUBRS POPJ, THEN
3403:         PUSHJ   P,MESS1                 ;IOACT OFF AT....
3404:         TLZE    IOS,IOW                 ;DO THIS RITUAL TO...
3405:         PUSHJ   P,SETIOD                ;GET OUT OF IO WAIT
3406:         JRST    DSIOS                   ;STORE IOS!
3407: 
3408: MESS1:  PUSHACS
3409:         PUSHJ   P,DISDATE
3410:         PUSHJ   P,DISMES
3411:         ASCIZ/IOACT OFF AT DRQDN.
3412: /
3413:         POPACS
3414:         JRST    DSIOS
3415: 
3416: MESS2:  PUSHACS
3417:         PUSHJ   P,DISDATE
3418:         PUSHJ   P,DISMES
3419:         ASCIZ/DEVIBF OFF BUT DEVSBB ON AT DNSTRT.
3420: /
3421:         POPACS
3422:         JRST    DSIOS
3423: 
3424: MESS3:  PUSHACS
3425:         PUSHJ   P,DISDATE
3426:         PUSHJ   P,DISMES
3427:         ASCIZ/IOACT OFF AT DNSTRT.
3428: /
3429:         POPACS
3430:         JRST    DSIOS
3431: 
3432: MESS4:  PUSHACS
3433:         PUSHJ   P,DISDATE
3434:         PUSHJ   P,DISMES
3435:         ASCIZ/DEVIBF AND IOACT ON AT DNSTRT.
3436: /
3437:         POPACS
3438:         JRST    DSIOS
3439: 
3440: MESS5:  PUSHACS
3441:         PUSHJ   P,DISDATE
3442:         PUSHJ   P,DISMES
3443:         ASCIZ/DEVIBF ON BUT DEVSSB OFF.
3444: /
3445:         POPACS
3446:         JRST    DSIOS
    DSKSER page# 0035 next  prev
3448: ;I-LEVEL SUBRS PUSHJ HERE TO START A TRANSFER.
3449: 
3450: TSTART: MOVEI   TAC,TRIES
3451:         HRRM    TAC,TFRCTL(DDB)
3452: TREDO:  PUSHJ   P,TGO
3453: TFSRTN: TRNN    IOS,IODERR!IODTER       ;ANY ERRORS?
3454:         POPJ    P,                      ;NO, OK RETURN.
3455:         SOS     TAC,TFRCTL(DDB)         ;COUNT DOWN
3456:         TRNE    TAC,-1                  ;TRIED ENOUGH?
3457:         JRST    TREDO                   ;NO, TRY AGAIN.
3458:         TLO     IOS,LOSBIG              ;INFORM THE HIGHER-UPS.
3459:         POPJ    P,                      ;RETURN LOSSAGE.
3460: 
3461: TGO:    MOVEM   DDB,DXB
3462:         MOVEM   J,DXJ
3463:         MOVEM   P,DXP
3464:         TRZ     IOS,IODERR!IODTER       ;WE HAVEN'T LOST YET.
3465:         MOVE    TAC,TFRSEC(DDB)
3466:         MOVEM   TAC,DXS
3467:         MOVE    TAC,TFRIOW(DDB)
3468:         MOVEM   TAC,DXW
3469:         HLRZ    TAC,TFRCTL(DDB)
3470:         MOVEM   TAC,DXC
3471:         JRST    GO2314
    DSKSER page# 0036 next  prev
3473: ;       ERROR HANDLING
3474: 
3475: ;ERRORS, CLASS 1. ENTER, ETC. RETURN CODES IN E+1
3476: 
3477: ENOUFD: POP     P,TAC                   ;ADJUST STACK
3478:         POP     P,TAC
3479:         JRST    ENOUF1
3480: 
3481: ENOFIL: JSP     TAC,ERRC1               ;0 - ZERO FILE NAME
3482: ENOUF1: JSP     TAC,ERRC1               ;1 - NO UFD
3483: EPROT:  JSP     TAC,ERRC1               ;2 - PROTECT VIOLATION
3484: EFWRIT: JSP     TAC,ERRC1               ;3 - FILE BEING WRITTEN
3485: EDNAME: JSP     TAC,ERRC1               ;4 - NAME IN USE
3486: EXFIL:  JSP     TAC,ERRC1               ;5 - NO LOOKUP OR ENTER - RENAME
3487: EANAME: JSP     TAC,ERRC1               ;6 - ENTER (ALTER) NAME DISAGREES
3488: ENODEV: JSP     TAC,ERRC1               ;7 - NO DEVICE (NO INIT)
3489: EGARB1: JSP     TAC,ERRC2               ;10 - GARBAGED UFD (POINTER OUT OF RANGE)
3490:                                         ; - AND OLD UDPS ACCESSED BY NEW UDPSER
3491: EGARB2: JSP     TAC,ERRC2               ;11 - GARBAGED FILE (POINTER WRONG)
3492: EFULLZ: JSP     TAC,ERRC1               ;12 - DISK IS FULL, TRY AGAIN LATER
3493: 
3494: ERRC2:  TRNN    IOS,GARBIT              ;SUPPRESS "BAD RTVL" MESSAGE??
3495:         JRST    EGARB                   ;NO. NOT A SPECIAL PERSON.
3496:         PUSHJ   P,ERZIOS                ;HOLD ALL FURTHER I/O.
3497: ERRC1:  SUBI    TAC,ENOFIL+1            ;GET ERROR CODE
3498:         XCTR    XRW,[HRRM TAC,ERRBOX(UUO)]      ;STUFF ERROR CODE
3499:         ANDI    TAC,-1
3500:         CAIE    TAC,11                  ;ALLOW RENAME OF FILE WITH BAD RETRIEVAL
3501:         SETZM   FILNAM(DDB)             ;DISABLE RENAME.
3502:         JRST    ERZIOS                  ;DISABLE I/O. DOES NOT RETURN.
3503: 
3504: ;ERRORS, CLASS 2. FLUSH USER, GO TO SYSTEM.
3505: 
3506: ENTFUL: PUSHJ   P,EFULLZ                ;GIVE FUNNY ERROR CODE
3507:         TRNE    IOS,GARBIT              ;IS HE ENABLED FOR DIRECT RETURN?
3508:         POPJ    P,                      ;YES. DO IT
3509: EDFULL: PUSH    P,IOS                   ;SAVE THE RELEVANT ACS
3510:         PUSHJ   P,DPOPJ                 ;CLEAR GOBIT IF SET AND SAVE ITS STATE
3511:         PUSH    P,DDB
3512:         PUSHJ   P,TTYFUW                ;FIND TTY
3513:         PUSHJ   P,INLMES
3514: ASCIZ /
3515: DISK IS FULL!/
3516:         PUSHJ   P,PRCRCC                ;TYPE CRLF ↑C
3517:         PUSHJ   P,TTYSTC                ;SET TTY INTO COMMAND MODE.
3518:         PUSHJ   P,STOP1                 ;STOP THE JOB
3519:         POP     P,DDB
3520:         POP     P,IOS                   ; RESTORE THE ACCUMULATORS
3521:         POPJ    P,                      ; AND RETURN TO SENDER.
3522: 
3523: ENOENT: JSP     TAC,ERRPTU
3524:         ASCIZ   /NEED ENTER BEFORE OUTPUT/
3525:         JRST    EXCALP
3526: 
3527: ENOLUK: JSP     TAC,ERRPTU
3528:         ASCIZ   /NEED LOOKUP BEFORE INPUT/
3529:         JRST    EXCALP
3530: 
3531: ELOSE:  JSP     TAC,ERRPTU
3532:         ASCIZ   /ERROR IN DSKSER/
3533:         JRST    EXCALP
3534: 
3535: EGARJ2: POP     P,TAC
3536: EGARPJ: POP     P,TAC                   ;FIX UP STACK
3537: EGARB:  PUSHJ   P,ERZIOS                ;HOLD ALL I/O.
3538:         TRNE    IOS,IODTER!IODERR       ;MACHINE OR DATA ERRORS?
3539:         JRST    EGARC                   ;2314 SCREW-UP
3540:         JSP     TAC,ERRPTU
3541:         ASCIZ   /BAD RETRIEVAL/
3542:         JRST    EXCALP
3543: 
3544: EGARC:  JSP     TAC,ERRPTU
3545:         ASCIZ   /DISK TRANSMISSION ERROR/
3546:         JRST    EXCALP
3547: 
3548: EACMFD: JSP     TAC,ERRPTU
3549:         ASCIZ   /CAN'T ENTER-RENAME MFD/
3550:         JRST    EXCALP
3551: 
3552: EDMPLS: JSP     TAC,ERRPTU
3553:         ASCIZ   /ILLEGAL FORMAT DUMP MODE COMMAND LIST/
3554:         JRST    EXCALP
3555: 
3556: ERZIOS: TLZ     IOS,GOBIT!LOSBIG!READB!WRITEB!ALTERB
3557:         JRST    DPOPJ                   ;TUCK IOS AWAY. DON'T LET USER DO ANYTHING.
    DSKSER page# 0037 next  prev
3559: ; USER DISK PACK SERVICE
3560: 
3561: ;SYSTEM INITIALIZATION:
3562: ; CLEAR DEVIOS FOR EACH UDP
3563: ; SET DVDSK IN DEVMOD - DEFAULT NEW STYLE
3564: ; LINK MODEL DDBS TOGETHER, LINKING OUT COPIED DDBS THAT WERE IN FREE STG
3565: 
3566: UDPINI: MOVSI   TAC1,DVDSK
3567:         MOVEI   TAC,DSKDSP
3568: FOR @$ UNUM←1,UPACKS
3569: <       SETZM   UDP$UNUM$DD+DEVIOS
3570:         IORM    TAC1,UDP$UNUM$DD+DEVMOD         ;INITIALLY DVDSK IN UDP DDBS
3571: IFN UNUM-1,<
3572:         HRLI    TAC,UDP$UNUM$DD
3573:         MOVEM   TAC,DEVSER+CAT(CAT(UDP,\<UNUM-1>),DD)
3574: >>
3575:         HRLI    TAC,PTRDDB
3576:         MOVEM   TAC,DEVSER+CAT(CAT(UDP,\UPACKS),DD)
3577:         POPJ    P,
3578: 
3579: 
3580:         JRST    CLRDDB          ;GIVE BACK DDB
3581:         JRST    SETDDB          ;MAKE DDB
3582:         JRST    UDPINI          ;INITIALIZE
3583:         JRST    DHUNG           ;HUNG TIMEOUT
3584: UDPDSP:JRST    ERZIOS          ;RELEASE, DISABLE WRITE
3585:         JRST    ERZIOS          ;CLOSE OUTPUT, SAME
3586:         JRST    UUOERR          ;BUFFERED OUTPUT
3587:         JRST    UUOERR          ;BUFFERED INPUT
3588:         JRST    PASSIT          ;ENTER, CHECK PASS WORD
3589:         JRST    UUOERR          ;LOOKUP
3590:         JRST    UDPOUT          ;DUMP OUTPUT
3591:         JRST    UDPIN           ;DUMP INPUT
3592:         JRST    UUOERR          ;USETO
3593:         JRST    UUOERR          ;USETI
3594:         JRST    UUOERR          ;UGETF
3595:         JRST    PASSET          ;RENAME, SET PASS WORD
3596:         POPJ    P,              ;CLOSE INPUT
3597:         POPJ    P,              ;UTPCLR
3598:         JRST    UUOERR          ;MTAPE
3599: 
3600: UDPIN:  MOVEI   TAC1,IOPCHN
3601:         JRST    UDPSER
3602: 
3603: UDPOUT: TLNN    IOS,WRITEB              ;ENTER DONE?
3604:         JRST    ENOENT                  ;NO
3605:         MOVEI   TAC1,DWRITE!IOPCHN
3606: 
3607: UDPSER: MOVSM   TAC1,TFRCTL(DDB)
3608:         HRRZ    AC1,UUO                 ;CHECK EVERY ADDRESS IN SIGHT.
3609:         PUSHJ   P,UADCK1                ;FOR LEGAL ADDRESS RANGE.
3610:         ADDI    AC1,1
3611:         PUSHJ   P,UADCK1                ;CHECK LAST CL WORD TOO.
3612:         XCTR    XR,[SKIPL (UUO)]        ;THIS IS BECAUSE DMPCMD DOES BRANCHING!
3613:         JRST    ADRERR                  ;ONLY IOWD'S ALLOWED
3614:         PUSHJ   P,DMPCMD                ;CHECK FOR LEGAL IOWD
3615:         MOVEM   TAC1,CORFAD(DDB)
3616:         XCTR    XR,[MOVE TAC1,(UUO)]    ;GET IOWD
3617:         LDB     DAT,PSEGN               ;UPPER (IF ANY)
3618:         JUMPE   DAT,UDPS1               ;NONE, MUST BE IN LOWER
3619:         HRRZ    DAT,JBTADR(DAT)         ;RELOC OF UPPER
3620:         TRZN    TAC1,400000             ;IN UPPER?
3621: UDPS1:  HRRZ    DAT,PROG                ;AFTER ALL THAT ITS IN THE LOWER
3622:         ADDI    TAC1,1(DAT)             ;RELOCATE AND MAKE IT XWD -WC,ADDRESS
3623:         MOVEM   TAC1,TFRIOW(DDB)        ;GOD ONLY KNOWS WHAT MCGUIRE WILL DO WITH THIS
3624:         XCTR    XR,[HRRZ TAC1,1(UUO)]   ;GET UDP BLOCK ADDR.
3625:         LDB     DAT,PUNIT
3626:         LDB     DAT,[POINT 32,NCYLSH+FPACKS-1(DAT),31]  ;NUMBER OF CYLS ON THIS PACK
3627:         IMULI   DAT,BKPTRK*TRKCYL       ;MULTIPLY TO GET TOTAL NUMBER OF BLOCKS
3628:         CAIL    TAC1,(DAT)              ;TOO BIG?
3629:         JRST    UADRER                  ;NO GOOD.
3630:         MOVE    TAC,JBTPRV(J)
3631:         TLNN    TAC,UDPPRV              ;LET DUMPER(1,2) GET AT LAST BLOCK
3632:         CAIE    TAC1,-1(DAT)            ;LAST LOGICAL BLOCK
3633:         CAIA
3634:         JRST    UADRER
3635:         LDB     TAC,PUNIT               ;GET UNIT NUMBER
3636:         ADD     TAC1,BFSET(TAC)         ;KLUGE UP START ADDR OF UDP.
3637:         LSH     TAC1,6                  ;PRETEND RECORD ZERO.
3638:         XCTR    XR,[HLRZ TAC,1(UUO)]
3639:         CAILE   TAC,RCPBLK              ;LEGAL RECORD NUMBER?
3640:         JRST    UADRER
3641:         IOR     TAC1,TAC                ;OR IT IN
3642:         MOVEM   TAC1,TFRSEC(DDB)
3643:         PUSHJ   P,GOSET
3644:         SETOM   DDLOC(DDB)
3645:         MOVEI   DAT,TSTART
3646:         PUSHJ   P,UEWAIT
3647:         SETZM   DDLOC(DDB)
3648:         JRST    DPOPJ
    DSKSER page# 0038 next  prev
3650: ;UDP PASS WORD STUFF
3651: 
3652: GPASIN: MOVEI   DAT,PASSIN              ;READ PASSWORD BLOCK
3653:         PUSHJ   P,NEWAIT
3654:         TRNE    IOS,IODERR!IODTER       ;ERRORS?
3655:         JRST    EGARB1                  ;YES
3656:         MOVE    TAC,['PASS  ']          ;CHECK FOR INITIALIZATION
3657:         CAMN    TAC,DSKDAT(DDB)
3658:         CAME    TAC,DSKDAT+1(DDB)
3659:         JRST    CPOPJ1                  ;NOT INITIALIZED. LET HIM IN
3660: ;HERE WE SHOULD VERIFY THAT IDSAT IN BLOCK 0 ISN'T USED
3661:         LDB     TAC,PUNIT
3662:         MOVE    AC1,BUFIOW              ;USE SYSBUF
3663:         MOVEM   AC1,TFRIOW(DDB)                 ;SET IT IN THE DDB
3664:         MOVEI   DAT,CHKSAT
3665:         PUSHJ   P,NEWAIT                        ;CAUSE SAT TO BE READ AND WAIT FOR IT.
3666:         MOVE    TAC,SYSBUF+IDSAT
3667:         CAME    TAC,['SATID ']
3668:         POPJ    P,
3669:         JSP     TAC,UUOMES
3670:         ASCIZ   /Illegal old-style access to new format UDP. UUO /
3671: 
3672: PASSIT: MOVE    TAC,JBTPRV(J)
3673:         TLNE    TAC,UDPPRV              ;LET DUMPER THROUGH (1,2)
3674:         JRST    PASSI1
3675:         TLZ     IOS,WRITEB              ;LOSE FOR NOW
3676:         PUSHJ   P,GPASIN                ;READ PASSWORD BLOCK. SKIP IF NONE THERE
3677:         SKIPN   TAC,DSKDAT+2(DDB)       ;MAY NOT BE NECESSARY
3678:         JRST    PASSI1                  ;BLANK PASSWORD, OR NO PASS BLOCK
3679:         CAME    TAC,['*SWAP*']          ;ALLOW WRITE ACCESS TO SCRATCH PACK
3680:         XCTR    XR,[CAMN TAC,(UUO)]     ;GET PASSWORD FROM USER
3681: PASSI1: TLOA    IOS,WRITEB              ;ALLOW WRITE ACCESS
3682:         JRST    EPROT                   ;PROTECTION FAILURE
3683:         JRST    DPOPJ1
3684: 
3685: PASSET: MOVE    TAC,JBTPRV(J)
3686:         TLNE    TAC,UDPPRV              ;LET DUMPER IN ALWAYS(1,2)
3687:         JRST    PASSE1
3688:         TLZN    IOS,WRITEB              ;CAN HE DO THIS?
3689:         JRST    ENOENT                  ;NO
3690:         PUSHJ   P,GPASIN
3691:         SKIPA   TAC,DSKDAT+2(DDB)
3692:         JRST    PASSE1                  ;NO PASSBLOCK - LET'S MAKE ONE
3693:         CAMN    TAC,['*SWAP*']
3694:         JRST    EPROT                   ;CAN'T CHANGE PASSWORD OF SWAPPING PACK
3695: PASSE1: MOVE    TAC,['PASS  ']
3696:         MOVEM   TAC,DSKDAT(DDB)
3697:         MOVEM   TAC,DSKDAT+1(DDB)
3698:         XCTR    XR,[MOVE TAC,(UUO)]     ;GET NEW PASS WORD!
3699:         MOVEM   TAC,DSKDAT+2(DDB)
3700:         SETZM   DSKDAT+3(DDB)
3701:         HRRI    TAC,DSKDAT+3(DDB)
3702:         HRL     TAC,TAC
3703:         ADDI    TAC,1
3704:         BLT     TAC,DSKDAT+SECSIZ-1(DDB)        ;CLEAR THE REST
3705:         MOVEI   DAT,PASOUT                      ;WRITE IN PASS WORD BLOCK
3706:         PUSHJ   P,NEWAIT
3707:         TRNE    IOS,IODERR!IODTER               ;ERRORS?
3708:         JRST    EGARB1
3709:         JRST    PASSI1                          ;OK
3710: 
3711: ;****** I-LEVEL SUBR ******
3712: PASOUT: SKIPA   TAC,[DWRITE!IOPCHN]             ;WRITE
3713: PASSIN: MOVEI   TAC,IOPCHN                      ;READ
3714:         MOVSM   TAC,TFRCTL(DDB)
3715:         MOVE    TAC,[XWD -SECSIZ,DSKDAT]
3716:         ADDI    TAC,(DDB)
3717:         MOVEM   TAC,TFRIOW(DDB)
3718:         LDB     TAC1,PUNIT
3719:         LDB     TAC,[POINT 32,NCYLSH+FPACKS-1(TAC1),31]
3720:         IMULI   TAC,BKPTRK*TRKCYL
3721:         SUBI    TAC,1
3722:         ADD     TAC,BFSET(TAC1)                 ;ADD BASE ADDRESS
3723:         LSH     TAC,6                           ;RECORD 0
3724:         MOVEM   TAC,TFRSEC(DDB)
3725:         JRST    TSTART                          ;DO IT
3726: 
3727: CHKSAT: MOVEI   TAC,IOPCHN                      ;READ
3728:         MOVSM   TAC,TFRCTL(DDB)
3729:         TLO     IOS,SATOP
3730:         LDB     TAC,PUNIT
3731:         MOVE    TAC,BFSET(TAC)                  ;DISK ADDRESS OF SAT TABLE
3732:         PUSHJ   P,BK2SEC                        ;CONVERT BLOCK TO SECTOR
3733:         MOVEM   TAC,TFRSEC(DDB)
3734:         PUSHJ   P,TSTART
3735:         TLZ     IOS,SATOP
3736:         POPJ    P,
 EOF: DSKSER end-of-file. cnt=37